uni-app入门:全局数据共享方案之mobx

简介: 全局数据共享也叫作状态管理,主要用于组件间数据共享问题的处理.实际开发中常用的实现方案:vuex、redux、mobx,本文主要介绍mobx.

1.全局数据共享介绍


    全局数据共享也叫作状态管理,主要用于组件间数据共享问题的处理.实际开发中常用的实现方案:vuex、redux、mobx,本文主要介绍mobx.


2.准备工作


mobx需要引入两个npm包:

   mobx-miniprogram:用于创建store实例对象

   mobx-miniprogram-bindings:用于将store中数据或是方法绑定到组件或是页面中.

   安装命令(项目所在目录下执行):

npm install --save mobx-miniprogram@4.13.2 mobx-miniprogram-bindings@1.2.1

204440b5fe381215cfa305e9d9b88385_97d9aa3e91504dc7b59fda786edda970.png

   安装完成之后,如果项目中存在miniprogram-npm文件夹则删除之后重新构建.构建完成之后重新生成的miniprogram-npm中会出现mobx-miniprogram 和mobx-miniprogram-bindings,构建方式以及构建完成新增文件夹如下:

da33fd5c8156071d580f5136156679eb_a1debd2759f04508815540db4eeaffeb.png


3.使用说明


   第一步创建store对象用于存储共享的数据或是方法;

   第二步将store数据或是方法绑定到页面或是组件中;

   第三步页面或是组件中使用全局共享数据或是方法.

   下面以案例的形式分别说明如何在页面或是组件中进行全局数据共享.


3.1 page页面进行全局数据共享

示例说明:

   定义num1、num2、sum12,sum12为num1和num2的和,创建两个按钮,分别实现点击之后对num1进行加2或是减2的操作.同时sum12能随着num1值的变化同时进行改变.

9a5da9c64ab2580b89fc0ddab433e12d_99cbc5c986e44aa6a8e2d88e00629a71.png

创建store对象:

根目录中创建store文件夹,然后创建store.js文件.store.js中内容如下:

// 导入mobx-miniprogram中的observable方法 
import {observable} from 'mobx-miniprogram';
// 调用observable方法创建store对象实例并导出进行共享
export const store=observable({
  // 定义数据
  num1:1,
  num2:2,
  // 计算数据属性
  get sum12() {
   console.log("sum12方法执行")
   return this.num1+this.num2
  },
  // 更新方法1用于修改num1的值
  updateNum1:action(function(step){
  this.num1+=step;
  }),
  // 更新方法2用于修改num2的值
  updateNum2:action(function(step){
  this.num2+=step;
  })
})


index.js中进行页面绑定store对象数据和方法:

// 导入创建store绑定方法
import {createStoreBindings} from 'mobx-miniprogram-bindings'
// 导入store实例对象
import {store} from '../../store/store'
Page({
  // 页面加载设置store绑定成员信息
  onLoad:function(){
   this.storeBindings=createStoreBindings(this,{
   store,
   fields:['num1','num2','sum12'],
   actions:['updateNum1']
   })
  },
  // 页面卸载时清理处理
  onUnload:function(){
    this.storeBingds=this.destroyStoreBindings()
  },
  // 按钮点击时触发的方法
  addNum(e){
    // 执行修改num1方法并按照指定步长step进行相加
    this.updateNum1(e.target.dataset.step)
  }
})


index.wxml页面中使用共享数据或是方法:

<view>{{num1}} + {{num2}} = {{sum12}}</view>
<van-button type="primary" bindtap="addNum" data-step='{{2}}'>num1加2</van-button>
<van-button type="warning" bindtap="addNum" data-step='{{-2}}'> num1减2</van-button>

3.2 component组件进行全局数据共享

示例说明:

   定义num1、num2、sum12,sum12为num1和num2的和,创建两个按钮,分别实现点击之后对num2进行加3或是减3的操作.同时sum12能随着num2值的变化同时进行改变.创建test组件在index页面进行引用.

25d53ffc26f752698ae0fccfa650d15d_6989cb1ffe1f471da4e6de2aa3d29f28.png

创建store对象同上示例,此处不再重述;

test.js中绑定store对象的数据或是方法:

import {storeBindingsBehavior} from 'mobx-miniprogram-bindings'
import {store} from '../../store/store'
  Component({
    behaviors:[storeBindingsBehavior], // 使用mobx-miniprogram-bindings中storeBindingsBehavior进行数据共享
    storeBindings:{
      store,
      fields:{  // 绑定数据,前者为组件中数据名,后者为store中定义的数据名,两者可不一致
        num1:'num1',
        num2:'num2',
        sum12:'sum12'
      },
      actions:{  // 绑定方法,前者为组件中方法名,后者为store中定义的方法名,两者可不一致
        updateNum2:'updateNum2'
      }
    }
})

test.wxml中调用store数据或是方法:

<view>{{num1}} + {{num2}} = {{sum12}}</view>
<van-button type="primary" bindtap="addNum" data-step='{{3}}'>num2加3</van-button>
<van-button type="warning" bindtap="addNum" data-step='{{-3}}'> num2减3</van-button>

index.wxml中引入test组件:

<view>{{num1}} + {{num2}} = {{sum12}}</view>
<van-button type="primary" bindtap="addNum" data-step='{{2}}'>num1加2</van-button>
<van-button type="warning" bindtap="addNum" data-step='{{-2}}'> num1减2</van-button>
<view>+++++++++++++++++++++++++++++++++++++</view>
<test></test>

最终实现效果如下:

4804d1eb18cbb2b78c4456878d162269_fff328a6bca346ac8e41eca701d88395.png


3.3综合案例:点击按钮实现自定义tabbar消息数同步变化

   案例说明:上篇文章uni-app入门:自定义tabbar介绍了如何自定义tabbar,此处在自定义tabbar的基础上介绍全局数据共享.pages/index页面中定义一参数num,初始化数据为2,点击按钮实现5操作,并将加5之后的num同步到tabbar的数字徽标上面.

a103dc0f6fb2eb22caca24b424130f78_86df5c606b1441999fd7afccdd3a333b.png

   实现思路说明:自定义tabbar上的数字徽标与pages/index页面中的num显示保持一致即可实现同步变化.可以将num作为全局数据共享的字段,分别绑定pages/index、自定义tabbar组件中。然后点击按钮实现num+5.

store/store.js中创建store对象(初始化num、定义num+5方法):

import {observable,action} from 'mobx-miniprogram'
export const store=observable({
  num:2,  // 初始化num
  // 变更num值,此处按照5进行增加
  updateNum:action(function(step){
      this.num+=step;
  })
})


   pages/index/index.js中绑定store中的num以及num+5方法:

// index.js
import {createStoreBindings} from 'mobx-miniprogram-bindings'
import {store} from '../../store/store'
Page({
  // 点击事件函数
  addNum:function(event){
    // 点击事件触发全局共享方法逻辑
 this.updateNum(event.target.dataset.numinterval);
    // 此处实现num+5只能对当前页面num数据实现变化
 // this.setData({
    //   num:this.data.num+event.target.dataset.numinterval
    // })
  },
  onLoad() {
      // 绑定共享数据
  this.storeBindings=createStoreBindings(this,
        {
          store,
          fields:['num'],
          actions:['updateNum']
         }
        )
  },
  onUnload(){
    this.storeBindings.destoryStoreBindings();
  }
})

点击按钮实现num的加5的实现逻辑要放到全局数据处理中,这样才能保证全局共享数据中的num实现变化,如果在按钮的点击事件中进行num+5只能对当前页面的num值做出变化.

page/index/index.wxml:

<view>当前数字:{{num}}</view>
<van-button type="primary" bindtap="addNum" data-numInterval='{{5}}'>数字加5</van-button>

自定义tabbar组件index.js中绑定store对象的num:

// custom-tab-bar/index.js
import {storeBindingsBehavior} from 'mobx-miniprogram-bindings'
import {store} from '../store/store'
Component({
  behaviors:[storeBindingsBehavior],
  // 映射参数绑定
  storeBindings:{
    store,
    fields:{ // 组件字段:store字段
      num:()=>store.num   //方式一
      //num:(store)=>store.num  // 方式二
     //  num:'num'             .// 方式三
    },
     // 映射方法绑定
  actions:{   // 组件方法:store方法
  }
  },
  data: {
    info:3,
    active: 0,
    icon: {
      normal: 'https://img.yzcdn.cn/vant/user-inactive.png',
      active: 'https://img.yzcdn.cn/vant/user-active.png',
    },
    "list": [{
      "pagePath": "/pages/index/index",
      "text": "首页"
    }, {
      "pagePath": "/pages/logs/logs",
      "text": "搜索"
    },
    {
      "pagePath": "/pages/mine/mine",
      "text": "我的"
    }]
  },
  /**
   * 组件的属性列表
   */
  properties: {
  },
  /**
   * 组件的方法列表
   */
  methods: {
    }
  }
})

自定义tabbar组件index.wx中数字徽标映射num:

van-tabbar active="{{ active }}" bind:change="onChange">
  <van-tabbar-item info="{{num}}">
    <image
      slot="icon"
      src="{{ icon.normal }}"
      mode="aspectFit"
      style="width: 30px; height: 18px;"
    />
    <image
      slot="icon-active"
      src="{{ icon.active }}"
      mode="aspectFit"
      style="width: 30px; height: 18px;"
    />
    自定义
  </van-tabbar-item>
  <van-tabbar-item icon="search">标签</van-tabbar-item>
  <van-tabbar-item icon="setting-o">标签</van-tabbar-item>
</van-tabbar>
相关文章
|
8天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
33 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
27天前
|
前端开发 API Android开发
10 大 APP 开发方案比较
本文首发于微信公众号“前端徐徐”,深入剖析了当前最受欢迎的十种APP开发方案,包括传统的iOS和Android开发、跨平台的React Native和Flutter、现代化的CapacitorJS和PWA等,旨在帮助开发者在众多选择中找到最适合的开发路径。通过详细分析每种方案的优缺点及适用场景,文章提供了详尽的比较和实用建议,助力高效、优质的APP开发。
82 0
10 大 APP 开发方案比较
|
1月前
|
小程序 JavaScript 前端开发
uni app 入门
uni app 入门
30 2
|
1月前
|
JSON API 网络安全
App数据的爬取
App数据的爬取
|
3月前
|
小程序 前端开发 Java
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
JavaDog Chat v1.0.0 是一款基于 SpringBoot、MybatisPlus 和 uniapp 的简易聊天软件,兼容 H5、小程序和 APP,提供丰富的注释和简洁代码,适合初学者。主要功能包括登录注册、消息发送、好友管理及群组交流。
104 0
SpringBoot+uniapp+uview打造H5+小程序+APP入门学习的聊天小项目
|
3月前
|
存储 SQL JSON
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
【Azure Logic App】微软云逻辑应用连接到数据库,执行存储过程并转换执行结果为JSON数据
|
3月前
|
缓存
【Azure Function】Function App代码中使用Managed Identity认证获取Blob数据时遇见400报错
【Azure Function】Function App代码中使用Managed Identity认证获取Blob数据时遇见400报错
【Azure Function】Function App代码中使用Managed Identity认证获取Blob数据时遇见400报错
|
3月前
|
网络协议 物联网 测试技术
App Inventor 2 MQTT拓展入门(保姆级教程)
本文演示的是App和一个测试客户端进行消息交互的案例,实际应用中,我们的测试客户端可以看着是任意的、支持MQTT协议的硬件,通过订阅及发布消息,联网硬件与我们的App进行双向数据通信,以实现万物互联的智能控制效果。
191 2
|
3月前
|
Docker 容器
【Azure 应用服务】App Service for Container 无法拉取Docker Hub中的镜像替代方案
【Azure 应用服务】App Service for Container 无法拉取Docker Hub中的镜像替代方案
|
3月前
【Azure 事件中心】在Azure Function App中消费Event Hub数据,时常出现EventReceiveError
【Azure 事件中心】在Azure Function App中消费Event Hub数据,时常出现EventReceiveError

热门文章

最新文章