微信小程序 的Mobx全局数据共享

一.全局数据共享

1.什么是全局数据共享

全局数据共享是为了解决组件之间数据共享的问题. 开发中常用的全局数据共享方案: Vuex,Redux,Mobx等

2.安装 Mobx 相关的包

在项目中运行如下命令,安装 Mobx 相关的包:npm i --save mobx-miniprogram@4.13.2 mobx-miniprogram-bindings@1.2.1
注意点:Mobx 相关的包安装完毕之后,要删除 miniprogram_npm 目录后,重新构建 npm

3.创建 Mobx 的 Store 实例

步骤:
1. 在根目录下创建一个 store 文件夹
2. 在 store 文件夹中 创建一个 store.js 文件
代码如下:

store.js
// 在这个 js 文件夹中,专门来创建 Store 的实例对象
// 按需导出一个方法 action
import { observable,action } from 'mobx-miniprogram'

export const store = observable({
  // 数据字段
  numA:1,
  numB:2,
  // 计算属性
  get sum(){
    return this.numA + this.numB
  },
  // actions 函数, 用来修改store中数据的值
  updateNum1: action(function(step){
    this.numA += step
  }),
  updateNum2: action(function(step){
    this.numA += step
  })
})

4.将 Store 中的成员绑定到页面中

// 页面.js 文件
// 第一步 导入需要的包 和 store实例
import {createStoreBindings} from 'mobx-miniprogram-bindings'
import { store } from '../../store/store'

Page({
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // this 指当前页面
    // 绑定 Mobx store
    this.storeBindings = createStoreBindings(this,{
      store,   // 实例
      fields:['numA','numB','sum'],  // 数据
      actions:['updateNum1']       // 方法
    })
  },
  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
    // 解绑
    this.storeBindings.detroyStoreBindings()
  }

5.在页面上使用 Store 中的成员

// 在 页面.wxml 中
<view>{{numA}} + {{numB}} = {{sum}}</view>
<button type="primary" size="mini" bindtap="btnHandler1" data-step="{{1}}">+1</button>

// 在 页面.js 中
btnHandler1(e){
    // 获取到数据
    console.log(this.data.numA)
    // 调用 全局数据共享的方法
    this.updateNum1(e.target.dataset.step)
  }

6.将 Store 中的成员绑定到组件中

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

Component({
	behaviors:[storeBindingsBehavior], // 通过 storeBindingsBehavior 来实现自动绑定
	storeBindings:{
		store,    // 指定要绑定的 Store
		fields:{
			numA:() => store.numA,  // 绑定字段的第 1 种方式
			numB:(store) => store.numB, // 绑定字段的第 2 种方式
			sum:'sum'   // 绑定字段的第 3 种方式
		},
		actions:{  // 指定要绑定的方法
			updateNum2:'updateNum2'
		}
	}
})

7.在组件中使用 Store 中的成员

// 组件的 .wxml 结构
<view>{{numA}} + {{numB}} = {{sum}}</view>
<button type="primary" size="mini" bindtap="btnHandler2" data-step="{{1}}">+1</button>

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

二.分包

1.什么是分包

分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载

2.分包的好处

  1. 可以优化小程序首次启动的下载时间
  2. 在多团队共同开发时可以更好的解耦协作

3.分包后项目的构成

分包后,小程序项目由 1 个主包 + 多个分包组成:

  1. 主包:一般只包含项目的启动页面或 TabBar 页面,以及所有分包都需要用到的一些公共资源
  2. 分包: 只包含和当前分包有关的页面和私有资源
    在这里插入图片描述

4.分包的加载规则

  1. 在小程序启动时,默认会下载主包并启动主包内页面
  • tabBar 页面需要放到主包中
  1. 当用户进入分包内某个页面时,客户端会把对应分包下载下来,下载完后在进行展示
  • 非 tabBar 页面可以按照功能的不同,划分为不同的分包之后,进行按需下载

5. 分包的体积限制

目前小程序分包大小有以下限制:
2. 整个小程序所有分包大小不超过 20M
3. 单个分包/主包大小不能超过 2M
4. 对小程序进行分包,可以优化小程序首次启动的下载时间,以及在多团队共同开发时可以更好的解耦协作

6.分包的配置方法

{
  "pages":[      // 主包的所有页面
    "pages/index/index",
    "pages/logs/logs",
    "pages/home/home",
    "pages/toat/toat"
  ],
  "subpackages":[  // 通过 subpackages 节点,声明分包的结构
    {
      "root": "pkgA",  // 第一个分包的根目录
      "name": "p1",   // 分包的别名
      "pages": [     // 当前分包下,所有页面的相对存放路径
        "pages/cat/cat",
        "pages/dog/dog"
      ]
    },
    {
      "root": "pkgB",
      "name": "p2",
      "pages": [
        "pages/apple/apple",
        "pages/banana/banana"
      ]
    }
  ]

7.分包的打包原则

  1. 小程序会按 subpackages 的配置进行分包, subpackages 之外的目录将被打包到主包中
  2. 主包也可以有自己的 pages (最外层的 pages 字段)
  3. tabBar 页面必须在主包内
  4. 分包之间不能互相嵌套

8.分包的引用原则

  1. 主包无法引用分包内的私有资源
  2. 分包之间不能相互引用私有资源
  3. 分包可以引用主包内的公共资源

9.什么是独立分包

独立分包本质上也是分包,只不过它比较特殊,可以独立于主包和其它分包而单独运行

10.独立分包和普通分包的区别

最主要的区别: 是否依赖于主包才能运行

  • 普通分包必须依赖于主包才能运行
  • 独立分包可以在不下载主包的情况下,独立运行

11.独立分包的应用场景

开发者可以按需,将某些具有一定功能独立性的页面配置到独立分包中,独立分包不依赖主包即可运行,可以很大成都上提升分包页面的启动速度
注意:一个小程序中可以有多个独立分包

12.独立分包的配置方法

“independent”: true // 通过此节点,声明当前 pkgB 为 “独立分包”

{
  "pages":[      // 主包的所有页面
    "pages/index/index",
    "pages/logs/logs",
    "pages/home/home",
    "pages/toat/toat"
  ],
  "subpackages":[    // 通过 subpackages 节点,声明分包的结构
    { 
      "root": "pkgA",  // 第一个分包的根目录
      "name": "p1",   // 分包的别名
      "pages": [      // 当前分包下,所有页面的相对存放路径
        "pages/cat/cat",
        "pages/dog/dog"
      ]
    },
    {
      "root": "pkgB",
      "name": "p2",
      "pages": [
        "pages/apple/apple",
        "pages/banana/banana"
      ],
      "independent": true  // 通过此节点,声明当前 pkgB 为 "独立分包"
    }
  ]

13.独立分包的引用原则

独立分包和普通分包以及主包之间,是相互隔绝的,不能相互引用彼此的资源
特别注意:独立分包中不能引用主包内的公共资源

14.什么是分包预下载

在进入小程序的某个页面时,由框架自动预下载可能需要的分包,从而提升进入后续分包页面时的启动速度

15.配置分包的预下载

预下载分包的行为,会在进入指定的页面时触发.在 app.json 中,使用 preloadRule 节点定义分包的预下载规则,代码如下:

在 app.json 中
"preloadRule": {
    "pages/toat/toat":{  // 触发分包预下载的页面路径
      "packages": ["pkgA"],  // 表示进入页面后,预下载那些分包
      "network": "all"   // 表示在指定的网络模式下进行预下载
    }
  },

16.分包预下载的限制

同一个分包中的页面享有共同的预下载大小限额 2M

总结:Mobx是全局数据共享,解决了组件和页面间数据共享,状态更新的问题,一个组件或页面更新数据能同步到另一个组件或者页面。全局数据是最简单的数据共享方式,但最好不要把所有需要共享的数据都往全局数据里放,避免全局数据污染,还有使用分包,独立分包和普通分包的区别,分包的预下载.这就是几天的学习总结

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值