微信小程序之mobx-miniprogram状态管理

目前已经学习了6种小程序页面、组件间的数据通信方案,分别是:

1. 数据绑定: properties

2.获取组件实例: this.selectComponent()

3.事件绑定: this.triggerEvent()

4. 获取应用实例:getApp()

5. 页面间通信: EventChannel

6.事件总线:pubsub-js

在中小型项目中,使用这些数据通信方式已经能够满足我们项目的需求。但是随着项目的业务逻辑越来越复杂,组件和页面间通信就会变的非常复杂。例如:有些状态需要在多个页面间进行同步使用,一个地方发生变更,所有使用的地方都需要发生改变,这时候如果使用前面的数据通信方案进行传递数据,给管理和维护将存在很大的问题。为了方便进行页面、组件之间数据的传递,小程序官方提供了一个扩展工具库:mobx-miniprogram

框架扩展: mobx-miniprogram:

mopx-miniprogram 是针对微信小程序开发的一个简单、高效、轻量级状态管理库,它基于 Mobx 状态管理框架实现。

使用 mobx-miniprogram 定义管理的状态是响应式的,当状态一旦它改变,所有关联组件都会自动更新相对应的数据通过该扩展工具库,开发者可以很方便地在小程序中全局共享的状态,并自动更新视图组件,从而提升小程序的开发效率

需要注意:在使用 mobx-miniprogram 需要安装两个包:

mobx-miniprogram 和 mobx-miniprogram-bindings

npm install mobx-miniprogram mobx-miniprogram-bindings
  • mobx-miniprogram 的作用:创建 Store 对象,用于存储应用的数据
  • mobx-miniprogram-bindings 的作用:将状态和组件、页面进行绑定关联,从而在组件和页面中操作数据
  • 安装完毕后,不要忘了左上角---编辑---构建

创建Store:

需要使用 mobx-miniprogram ,因此需要先熟悉 mobx-miniprogram 三个核心概念:

1. observable: 用于创建一个被监测的对象,对象的属性就是应用的状态(state),这些状态会被转换成响应式数据。

2. action: 用于修改状态(state)的方法,需要使用 action 函数显式的声明创建。

3. computed: 根据已有状态(state)生成的新值。计算属性是一个方法,在方法前面必须加上 get 修饰符


  • 在项目的根目录下创建 store 文件夹,然后在该文件夹下新建 numStore.js (名字任意)
  • 在 /store/numStore.js 导入 observable、action 方法

import { observable, action } from 'mobx-miniprogram'

export const numStore = observable({
    // 对象的属性就是应用的状态
    numA:1,
    numB:2,
    
    // 定义 action 方法,用来修改状态
    update: action(function(){
        // 在方法中如果需要获取状态,可以使用 this 进行获取
        this.numA += 1
        this.numB += 1    
    })
    
    // 计算属性 computed
    // 是根据已有状态产生新的状态
    // 计算属性前面需要使用 get 修饰符进行修饰
    get sum(){
        // 计算属性内部必须要有返回值
        retrun this.numA + this.numB
    }
})

通用方法:在组件中使用数据

使用 mobx-miniprogram-bindings 将 Store 和页面或组件进行绑定关联

如果需要在组件中使用状态,需要 mobx-miniprogram-bindings 库中导入 ComponentWithstore 方法

在使用时:需要将 Component 方法替换成 ComponentWithStore 方法,原本组件配置项也需要写到该方法中

在替换以后,就会新增一个 storeBindings 配置项,配置项常用的属性有以下三个:

1. store: 指定要绑定的 Store 对象

2. fields: 指定需要绑定的 data字段

3. actions: 指定需要映射的 actions 方法

// 如果需要在组件中使用 Store 中的数据以后方法
// 需要从 mobx-miniprogram-bindings 里面引入 Componentwithstore 方法
import { ComponentwithStore } from 'mobx-miniprogram-bindings'

// 导入当前组件需要使用的 Store 对象
import{ numStore } from '../../stores/numstore'

// 需要使用 ComponentwithStore 方法将 Component 方法进行替换
ComponentwithStore({
    // 用来配置当前组件需要与哪些Store进行关联


    storeBindings: {
        store: numStore, // 当前组件需要使用number store 这一个对象
        fields: ['numA', 'numB', 'sum'], // 当前组件需要使用这个sotre中的那些数据
        actions: ['update']
    }
})

注意: 在从 Stroe 对象中引入数据和方法以后

  • 如果是数据,会被注入到data对象中
  • 如果是方法,会被注入到methods对象中
<view> {{ numA}} + {{ numB }} = {{sum}} </view>
<button type="warn" plain bindtap="update">更新 Store 中的数据</button>

上面由于 update方法被注入到methods当中,所以可以在模版中直接调用

第一种:使用Component方法来构建页面组件中使用Store

方法和上面正常的使用方式是一样的

1.从 mobx-miniprogram-bindings 库中导入 ComponentWithStore 方法

2.将 Component 方法替换成 Componentwithstore 方法

3.然后配置 storeBindings 从Store 中映射数据和方法即可

第二种:不使用Component 方法构建页面组件中使用Store

  • 这时候需要使用 mobx-miniprogram-bingings 提供的 Behaviorwithstore方法来和 Store 建立关联。
    • Behaviorwithstore 定义在当前组件 or 页面根目录下 的 behavior.js中
    • 我们去配置Behaviorwithstore 具体和哪些Store联系,供当前页面使用

小程序的behavior方法是一种代码复用的方式,可以将一些通用的逻辑和方法提取出来,然后在多个组件中复用,从而减少代码冗余,提高代码的可维护性。在页面中也可以使用 behaviors 配置项

使用方法:

1. 新建 behavior.js 文件,从 mobx-miniprogram-bindings 库中导入 BehaviorWithstore 方法

2.在BehaviorWithstore方法中配置 storeBindings 配置项从 Store 中映射数据和方法

3. 在 Page 方法中导入创建的 behavior ,然后配置 behavior 属性,并使用导入的 behavior


  • 关联store初始化

  • cart.js中注册(当前需要使用的页面注册)
    • 注册完毕后会自动映射到data中,相当于已经取出了store中的内容放到data中了,可以直接调用

  • 直接可以在页面中使用:

fields、actions 对象写法

fields、actions 有两种写法:数组 或者 对象。

我们之前使用的是 数组 的写法:

fileds: ['numA','numB','sum'], 
actions: ['update']

下面介绍一下对象的写法:

  • filelds的对象写法
    • 映射写法
    • 函数写法
fields: {
    // 两种写法:
        
    // 映射形式: 需要指定 data 中哪些字段来源于 store,以及 在 store 中的名字是什么
    numA: 'numA',
    numB: 'numA',
    numC: 'numA'
    
    // 函数形式
    // key: data 中哪些字段来源于 store
    // value: 函数, 函数内部需要返回对应 store 数据的值
    numA: () => numStore.numA,
    numB: () => numStore.numB,
    numC: () => numStore.numC,
    
    // 自定义属性
    // 如果对属性进行了自定义,模板中需要使用自定义以后的属性
    a: 'numA',
    b: 'numB',
    total: 'sum'
}

在对象写法中可以通过自定义属性来重新命名,使用了自定义属性后,模版中的属性也必须对应自定义属性

  • action的对象写法:
    • 映射写法
      • 自定义属性
actions:{
 // 如果将 actions 改成对象写法
 // actions 只有映射形式一种写法
 // 指定模板中使用的哪些方法来源于 store,并且在 store 中的名字是什么
 updateData: 'update   
}

绑定多个组件以及命名空间

在实际开发中,一个页面或者组件可能会绑定多个 Store ,这时候我们可以将storeBindings 改造成数组。数组每一项就是一个个要绑定的 Store

如果多个 Store 中存在相同的数据,显示会出现异常。还可以通过 namespace 属性给当前 Store 开启命名空间,在开启命名空间以后,访问数据的时候,需要加上 namespace 的名字才可以。

两者store中有变量或方法冲突了

有两种解决方式:

第一种: 将 fields 以及 actions 改成对象方式

第二种:添加命名空间

  • 访问命名空间的数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/971255.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

express + vue 部署宝塔

域名备案 我这里是不同的账号&#xff0c;需要先登录服务器的账号生成授权码给到对应域名的账号。目前域名审核中。 进入域名账号&#xff0c;进行备案即可。 登录阿里云密码设置 未设置登录远程服务的密码&#xff0c;要先设置密码。 登录服务 设置安全组 根据宝塔的需要端…

250214-java类集框架

引言 类集框架本质上相当于是容器&#xff0c;容器装什么东西由程序员指定 1.单列集合 单列集合是list和set&#xff0c;list的实现类有ArrayList和LinkedList&#xff0c;前者是数组实现&#xff0c;后者是链表实现。list和set&#xff0c;前者有序、可重复&#xff0c;后者…

【华为OD机考】2024E+D卷真题【完全原创题解 详细考点分类 不断更新题目 六种主流语言Py+Java+Cpp+C+Js+Go】

可上 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 oj1441了解算法冲刺训练&#xff08;备注【CSDN】否则不通过&#xff09; 文章目录 相关推荐阅读模拟 数学排序字符串基础数组基础系统设计蒙特卡洛模拟其他 栈 常规栈单调栈 队列&#xff08;题目极少&#xff0c;几乎不…

【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界

目录 前言 一、Python—— 网络爬虫的绝佳拍档 二、网络爬虫基础&#xff1a;揭开神秘面纱 &#xff08;一&#xff09;工作原理&#xff1a;步步为营的数据狩猎 &#xff08;二&#xff09;分类&#xff1a;各显神通的爬虫家族 三、Python 网络爬虫核心库深度剖析 &…

借3D视觉定位东风,汽车零部件生产线实现无人化的精准飞跃

在新能源汽车市场的推动下&#xff0c;汽车零部件制造业正迎来前所未有的发展机遇。然而&#xff0c;传统的生产方式已经无法满足现代制造业对高效、精准的要求。为了应对这一挑战&#xff0c;越来越多的企业开始探索智能化生产的道路。 在这个过程中&#xff0c;3D视觉定位系…

Linux 服务器部署deepseek

把手教你在linux服务器部署deepseek&#xff0c;打造专属自己的数据库知识库 正文开始 第一步&#xff1a;安装Ollama 打开官方网址&#xff1a;https://ollama.com/download/linux 下载Ollama linux版本 复制命令到linux操作系统执行 [rootpostgresql ~]# curl -fsSL http…

20250213编译飞凌的OK3588-C_Linux5.10.209+Qt5.15.10_用户资料_R1

20250213编译飞凌的OK3588-C_Linux5.10.209Qt5.15.10_用户资料_R1 2025/2/13 11:43 缘起&#xff1a;飞凌发布了高版本内核的适配OK3588-C的Buildroot的SDK&#xff1a;OK3588-C_Linux5.10.209Qt5.15.10_用户资料_R1。 但是编译异常了。 于是按照百度升级libc6&#xff0c;可以…

img标签的title和alt

img标签的title和alt 显示上 title:鼠标移入到图片上时候显示的内容&#xff1b; alt:图片无法加载时候显示的内容; <div class"box"><div><!-- title --><h3>title</h3><img src"./image/poster.jpg" title"这是封…

案例-04.部门管理-删除

一.功能演示 二.需求说明 三.接口文档 四.思路 既然是通过id删除对应的部门&#xff0c;那么必然要获取到前端请求的要删除部门的id。id作为请求路径传递过来&#xff0c;那么要从请求路径中获取&#xff0c;id是一个路径参数。因此使用注解PathVariable获取路径参数。 请求方…

性格测评小程序07用户登录

目录 1 创建登录页2 在首页检查登录状态3 搭建登录功能最终效果总结 小程序注册功能开发好了之后&#xff0c;就需要考虑登录的问题。首先要考虑谁作为首页&#xff0c;如果把登录页作为首页&#xff0c;比较简单&#xff0c;每次访问的时候都需要登录。 如果把功能页作为首页&…

服务器被暴力破解的一次小记录

1. 网络架构 家里三台主机&#xff0c;其他一台macmini 启用ollama运行大模型的服务&#xff0c;主机1用来部署一些常用的服务如&#xff1a;mysql, photoprism等&#xff0c;服务器作为网关部署docker, 并且和腾讯云做了内网穿透。服务器部署了1panel用来管理服务并且监控&…

长视频生成、尝试性检索、任务推理 | Big Model Weekly 第56期

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 01 COMAL:AConvergent Meta-Algorithm for Aligning LLMs with General Preferences 许多对齐方法&#xff0c;包括基于人类反馈的强化学习&#xff08;RLHF&#xff09;&#xff0c;依赖于布拉德利-特里&#…

STM32 串口转 虚拟串口---实现USB转串口功能

一&#xff0c;USART与UART 区别 USART&#xff08;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff09;通用同步/异步串行接收/发送器 相较于UART&#xff1a;通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter&#xff09;多了…

将OpenWrt部署在x86服务器上

正文共&#xff1a;1234 字 40 图&#xff0c;预估阅读时间&#xff1a;2 分钟 如果你问ChatGPT有哪些开源的SD-WAN方案&#xff0c;他会这样答复你&#xff1a; 我们看到&#xff0c;OpenWrt也属于比较知名的开源SD-WAN解决方案。当然&#xff0c;在很久之前&#xff0c;我就发…

EtherNetIP转ModbusTCP网关,给风电注入“超级赛亚人”能量

EtherNetIP转ModbusTCP网关&#xff0c;给风电注入“超级赛亚人”能量 在工业通信领域&#xff0c;常常需要将不同网络协议的设备和系统连接起来&#xff0c;以实现更高效的数据交互和系统集成。比如&#xff0c;把EtherNet/IP设备及其网络连接到ModbusTCP网络系统&#xff0c…

【LeetCode】438.找到字符串中所有的字母异位词

目录 题目题目要求什么是“异位词”&#xff1f;如何快速判断两个字符串是否是“异位词”&#xff1f; 解法 滑动窗口 哈希表 &#xff08;统计个数&#xff09;核心思路具体步骤 代码 题目 题目链接&#xff1a;LeetCode-438题 给定两个字符串 s 和 p&#xff0c;找到 s 中所…

【设计模式】【结构型模式】装饰者模式(Decorator)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…

基于Ubuntu+vLLM+NVIDIA T4高效部署DeepSeek大模型实战指南

一、 前言&#xff1a;拥抱vLLM与T4显卡的强强联合 在探索人工智能的道路上&#xff0c;如何高效地部署和运行大型语言模型&#xff08;LLMs&#xff09;一直是一个核心挑战。尤其是当我们面对资源有限的环境时&#xff0c;这个问题变得更加突出。原始的DeepSeek-R1-32B模型虽…

Windows环境搭建ES集群

搭建步骤 下载安装包 下载链接&#xff1a;https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.27-windows-x86_64.zip 解压 解压并复制出3份 es-node1配置 config/elasticsearch.yml cluster.name: xixi-es-win node.name: node-1 path.data: D:\\wor…

STM32 I2C通信协议说明

目录 背景 I2C协议 数据的有效性 I2C通信开始和停止条件 I2C数据传输 发送 响应 正常情况&#xff1a; 异常情况&#xff1a; 主机结束接收 写寄存器的标准流程 读寄存器的标准流程 仲裁机制 时钟同步 SDA线的仲裁 程序 背景 对单片机的三大通信中的I2C通信进…