【微信小程序】 全局数据共享

 

1.什么是全局数据共享

全局数据共享(又叫做:状态管理)是为了解决组件之间数据共享的问题。

开发中常用的全局数据共享方案有: Vuex、Redux、 MobX等。

 

2.小程序中的全局数据共享方案

在小程序中,可使用mobx-miniprogram

配合mobx-miniprogram-bindings实现全局数据共享。

其中:

● mobx- miniprogram

  用来创建Store实例对象

● mobx-miniprogram-bindings

  用来把Store中的共享数据或方法,绑定到组件或页面中使用

 

3、MOBX安装

需要先有NPM支持

https://www.cnblogs.com/mindzone/p/16223460.html

安装MOBX依赖

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

安装完成后,每次都要删除之前构建Miniprogram_npm包

然后重新构建生成

 

4、编写Store文件

/**
 * /store/index.js
 * 导入Mobx包资源
 */
import { action, observable } from 'mobx-miniprogram'

const config = {
  // 配置对象中,存放需要共享的数据字段
  numA:1,
  numB:2,

  // 设置只读的计算属性 get 标记该数据只能只读
  get sum() { return this.numA + this.numB },

  // actions方法, 用来修改store中的数据
  updateNum1: action(function (step) {
    this.numA += step
  }),
  updateNum2: action(function (step) {
    this.numB += step
  }),
}
// 导出资源
export const store = observable(config)

  

5、绑定页面

在页面的JS文件中导入资源:

import { createStoreBindings } from 'mobx-miniprogram-bindings'
import { store } from '../../store/index'

加载时绑定Store资源

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    // 页面加载时设置绑定
    this.storeBindings = createStoreBindings(
      this, {
        store,
        fields: ['numA', 'numB', 'sum'],
        actions: ['updateNum1', 'updateNum2']
      }
    )
  },

结束时解除Store资源

/**
 * 生命周期函数--监听页面卸载
 */
onUnload() {
  // 解除绑定
  this.storeBindings.destoryStoreBindings()
},

6、使用Store配置:

store变量页面展示

<view>
  {{numA}} + {{numB}} = {{sum}}
</view>
<van-button 
  data-step="{{1}}"
  type="primary" 
  bindtap="btnHandler1">
  numA + 1
</van-button>

<van-button 
  data-step="{{-1}}"
  type="danger" 
  bindtap="btnHandler2">
  numA - 1
</van-button>

绑定的方法,这里演示了如何获取dataset变量

  btnHandler1(e) {
    this.updateNum1( e.target.dataset.step)
  },
  btnHandler2(e) {
    this.updateNum1( e.target.dataset.step)
  }

  

7、配置Store到组件中使用

 组件引入Mobx资源:

import { storeBindingsBehavior } from 'mobx-miniprogram-bindings'
import { store } from '../../store/index'

绑定Store和对应的属性:

// components/test6/test6.js
Component({
  behaviors: [storeBindingsBehavior],

  storeBindings: {
    store,

    // 声明绑定的字段
    fields: {
      // 写法一
      numA: () => store.numA,
      // 写法二
      numB: (store) => store.numB,
      // 写法三
      sum: 'sum' 
    },
    // 绑定的方法
    actions: {
      updateNum2: 'updateNum2'
    }
  }
})

方法编写:

  /**
   * 组件的方法列表
   */
  methods: {
    btnHandler1(e) {
      this.updateNum2( e.target.dataset.step)
    },
    btnHandler2(e) {
      this.updateNum2( e.target.dataset.step)
    }
  }

组件HTML代码

<!--components/test6/test6.wxml-->
<text>components/test6/test6.wxml</text>
<view>
  {{numA}} + {{numB}} = {{sum}}
</view>
<van-button 
  data-step="{{1}}"
  type="primary" 
  bindtap="btnHandler1">
  numB + 1
</van-button>

<van-button 
  data-step="{{-1}}"
  type="danger" 
  bindtap="btnHandler2">
  numB - 1
</van-button>

  

在页面和组件能够共同操作Store存储的变量:

 

posted @ 2022-05-05 14:03  emdzz  阅读(746)  评论(0编辑  收藏  举报