微信小程序 --- mobx-miniprogram miniprogram-computed
1.1 mobx-miniprogram 介绍
目前已经学习了 6 种小程序页面、组件间的数据通信方案,分别是:
- 数据绑定:
properties
- 获取组件实例:
this.selectComponent()
- 事件绑定:
this.triggerEvent()
- 获取应用实例:
getApp()
- 页面间通信:
EventChannel
- 事件总线:
pubsub-js
在中小型项目中,使用这些数据通信方式已经能够满足我们项目的需求。
但是随着项目的业务逻辑越来越复杂,组件和页面间通信就会变的非常复杂。例如:有些状态需要在多个页面间进行同步使用,一个地方发生变更,所有使用的地方都需要发生改变,这时候如果使用前面的数据通信方案进行传递数据,给管理和维护将存在很大的问题。
为了方便进行页面、组件之间数据的传递,小程序官方提供了一个扩展工具库: mobx-miniprogram
mobx-miniprogram
是针对微信小程序开发的一个简单、高效、轻量级状态管理库,它基于Mobx
状态管理框架实现。
使用 mobx-miniprogram
定义管理的状态是响应式的,当状态一旦它改变,所有关联组件都会自动更新相对应的数据
通过该扩展工具库,开发者可以很方便地在小程序中全局共享的状态,并自动更新视图组件,从而提升小程序的开发效率
需要注意:在使用 mobx-miniprogram
需要安装两个包:mobx-miniprogram
和 mobx-miniprogram-bindings
mobx-miniprogram
的作用:创建Store
对象,用于存储应用的数据mobx-miniprogram-bindings
的作用:将状态和组件、页面进行绑定关联,从而在组件和页面中操作数据
npm install mobx-miniprogram mobx-miniprogram-bindings
官方文档:
-
mobx-miniprogram 官方文档
-
mobx-miniprogram-bindings 官方文档
1.2 创建 Store 对象
如果需要创建 Store 对象需要使用 mobx-miniprogram
,因此需要先熟悉 mobx-miniprogram
三个核心概念:
observable
:用于创建一个被监测的对象,对象的属性就是应用的状态(state),这些状态会被转换成响应式数据。action
:用于修改状态(state)的方法,需要使用 action 函数显式的声明创建。computed
:根据已有状态(state)生成的新值。计算属性是一个方法,在方法前面必须加上get
修饰符
mobx-miniprogram
详细的使用步骤如下:
-
在项目的根目录下创建
store
文件夹,然后在该文件夹下新建index.js
-
在
/store/index.js
导入observable
、action
方法import { observable, action } from 'mobx-miniprogram'
-
使用
observable
方法需要接受一个store
对象,存储应用的状态// observable:用于创建一个被监测的对象,对象的属性就是应用的状态(state),这些状态会被转换成响应式数据。 // action:用于显式的声明创建更新 state 状态的方法 import { observable, action } from 'mobx-miniprogram'// 使用 observable 创建一个被监测的对象 export const numStore = observable({// 创建应用状态numA: 1,numB: 2,// 使用 action 更新 numA 以及 numBupdate: action(function () {this.numA+=1this.numB+=1}),// 计算属性,使用 get 修饰符,get sum() {return this.numA + this.numB;}})
1.3 在组件中使用数据
如果需要 Page
或者Component
中对共享的数据进行读取、更新操作,需要使用 mobx-miniprogram-bindings
mobx-miniprogram-bindings
的作用就是将 Store
和 页面或组件进行绑定关联
如果需要在组件中使用状态,需要 mobx-miniprogram-bindings
库中导入 ComponentWithStore
方法
在使用时:需要将 Component
方法替换成 ComponentWithStore
方法 ,原本组件配置项也需要写到该方法中
在替换以后,就会新增一个 storeBindings
配置项,配置项常用的属性有以下三个:
store
: 指定要绑定的Store
对象fields
: 指定需要绑定的data
字段actions
: 指定需要映射的actions
方法
📌 注意事项:
导入的数据会同步到组件的 data 中
导入的方法会同步到组件的 methods 中
// components/custom01/custom01.js
import { ComponentWithStore } from 'mobx-miniprogram-bindings'
import { numStore } from '../../stores/numstore'ComponentWithStore({data: {someData: '...'},storeBindings: {store: numStore,fields: ['numA', 'numB', 'sum'],actions: ['update']}
})
1.4 在页面中使用数据-方式1
Component 方法用于创建自定义组件。
小程序的页面也可以视为自定义组件,因此页面也可以使用 Component 方法进行构建,从而实现复杂的页面逻辑开发。
如果我们使用了 Component 方法来构建页面,那么页面中如果想使用 Store
中的数据,使用方式和组件的使用方式是一样的
- 从
mobx-miniprogram-bindings
库中导入ComponentWithStore
方法 - 将
Component
方法替换成ComponentWithStore
方法 - 然后配置
storeBindings
从Store
中映射数据和方法即可
// index/index.js
import { ComponentWithStore } from 'mobx-miniprogram-bindings'
import { numStore } from '../../stores/numstore'ComponentWithStore({data: {someData: '...'},storeBindings: {store: numStore,fields: ['numA', 'numB', 'sum'],actions: ['update']}
})
1.5 在页面中使用数据-方式2
在上一节,我们使用了 Component 方法构建页面,然后使用 ComponentWithStore
方法让页面和 Store
建立了关联
如果不想使用 Component 方法构建页面。这时候需要使用 mobx-miniprogram-bindings
提供的 BehaviorWithStore
方法来和 Store
建立关联。
小程序的 behavior 方法是一种代码复用的方式,可以将一些通用的逻辑和方法提取出来,然后在多个组件中复用,从而减少代码冗余,提高代码的可维护性。在页面中也可以使用 behaviors
配置项
使用方式如下:
- 新建
behavior
文件,从mobx-miniprogram-bindings
库中导入BehaviorWithStore
方法 - 在
BehaviorWithStore
方法中配置storeBindings
配置项从Store
中映射数据和方法 - 在
Page
方法中导入创建的behavior
,然后配置behavior
属性,并使用导入的behavior
// behavior.jsimport { BehaviorWithStore } from 'mobx-miniprogram-bindings'
import { numStore } from '../../stores/numstore'export const indexBehavior = BehaviorWithStore({storeBindings: {store: numStore,fields: ['numA', 'numB', 'sum'],actions: ['update'],}
})
// index.jsimport { indexBehavior } from './behavior'Page({behaviors: [indexBehavior]// 其他配置项
})
1.6 fields、actions 对象写法
fields
、actions
有两种写法:数组 或者 对象。
如果 fields
写成对象方式,有两种写法:
-
映射形式:指定 data 中哪些字段来源于
store
以及它们在store
中对应的名字。- 例如
{ a: 'numA', b: 'numB' }
- 例如
-
函数形式:指定 data 中每个字段的计算方法
- 例如
{ a: () => store.numA, b: () => anotherStore.numB }
- 例如
如果 actions
写成对象方式,只有两种写法:
- 映射形式:指定模板中调用的哪些方法来源于
store
以及它们在store
中对应的名字。- 例如
{ buttonTap: 'update' }
- 例如
import { ComponentWithStore } from 'mobx-miniprogram-bindings'
import { numStore } from '../../stores/numstore'ComponentWithStore({data: {someData: '...'},storeBindings: {store: numStore,fields: {// 使用函数方式获取 Store 中的数据a: () => store.numA,b: () => store.numB,// 使用映射形式获取 Store 中的数据,值为数据在 store 中对应的名字total: 'sub'},// 使用映射形式获取 Store 中的 action 名字actions: {// key 自定义,为当前组件中调用的方法// 值为 store 中对应的 action 名字buttonTap: 'update'}}
})
1.7 绑定多个 store 以及命名空间
在实际开发中,一个页面或者组件可能会绑定多个 Store
,这时候我们可以将 storeBindings
改造成数组。数组每一项就是一个个要绑定的 Store
。
如果多个 Store
中存在相同的数据,显示会出现异常。还可以通过 namespace
属性给当前 Store
开启命名空间,在开启命名空间以后,访问数据的时候,需要加上 namespace
的名字才可以。
// behavior.jsimport { BehaviorWithStore } from 'mobx-miniprogram-bindings'
import { numStore } from '../../stores/numstore'export const indexBehavior = BehaviorWithStore({storeBindings: [{namespace: 'numStore',store: numStore,fields: ['numA', 'numB', 'sum'],actions: ['update'],}]
})
// index/index.wxml<view>{{ numStore.numA }} + {{ numStore.numB }} = {{numStore.sum}}</view>
02. miniprogram-computed
小程序框架没有提供计算属性相关的 api ,但是官方为开发者提供了拓展工具库 miniprogram-computed。
该工具库提供了两个功能:
- 计算属性
computed
- 监听器
watch
2.1 计算属性 computed
知识点:
如果需要在组件中使用计算属性功能,需要 miniprogram-computed
库中导入 ComponentWithComputed
方法
在使用时:需要将 Component
方法替换成 ComponentWithComputed
方法 ,原本组件配置项也需要写到该方法中
在替换以后,就可以新增 computed
以及 watch
配置项。
安装 miniprogram-computed
, 在安装以后,需要点击 构建 npm
,进行本地构建
npm install miniprogram-computed
📌 注意事项:
computed
函数中不能访问 this ,但是提供了形参,代表data
对象 计算属性函数的返回值会被设置到 this.data.sum 字段中
官方文档:miniprogram-computed
落地代码:
计算属性 computed
的使用
// component.js// 引入 miniprogram-computed
import { ComponentWithComputed } from 'miniprogram-computed'ComponentWithComputed({data: {a: 1,b: 1},computed: {total(data) {// 注意: // computed 函数中不能访问 this ,只有 data 对象可供访问// 这个函数的返回值会被设置到 this.data.sum 字段中// 计算属性具有缓存,计算属性使用多次,但是计算属性方法只会执行一次console.log('~~~~~')return data.a + data.b}}
})
2.2 监听器 watch
在使用时:需要将 Component
方法替换成 ComponentWithComputed
方法 ,原本组件配置项也需要写到该方法中
在替换以后,就可以新增 computed
以及 watch
配置项。
// 引入 miniprogram-computed
import { ComponentWithComputed } from 'miniprogram-computed'ComponentWithComputed({data: {a: 1,b: 1},computed: {total(data) {// 注意: // computed 函数中不能访问 this ,只有 data 对象可供访问// 这个函数的返回值会被设置到 this.data.sum 字段中return data.a + data.b}}watch: {// 同时对 a 和 b 进行监听'a, b': function (a, b) {this.setData({total: a + b})}},methods: {updateData() {this.setData({a: this.data.a + 1,b: this.data.b + 1})}}
})
拓展:Mobx 与 Computed 结合使用
两个框架扩展提供的 ComponentWithStore
与 ComponentWithComputed
方法无法结合使用。
如果需要在一个组件中既想使用 mobx-miniprogram-bindings
又想使用 miniprogram-computed
解决方案是:
-
使用旧版
API
-
自定义组件仍然使用
Component
方法构建组件,将两个扩展依赖包的使用全部改为旧版API
-
mobx-miniprogram-bindings 官方文档
-
miniprogram-computed 官方文档
-
-
使用兼容写法
-
即要么使用
ComponentWithStore
方法构建组件,要么使用ComponentWithComputed
方法构建组件 -
如果使用了
ComponentWithStore
方法构建组件,计算属性写法使用旧版API
-
如果使用了
ComponentWithComputed
方法构建组件,Mobx写法使用旧版API
-
我们演示使用兼容写法:
-
如果使用了
ComponentWithStore
方法构建组件,计算属性写法使用旧版API
import { ComponentWithComputed } from 'miniprogram-computed'// component.js const computedBehavior = require('miniprogram-computed').behaviorComponentWithStore({behaviors: [computedBehavior],data: {a: 1,b: 1,sum: 2},watch: {'a, b': function (a, b) {this.setData({total: a + b})}},computed: {total(data) {// 注意: computed 函数中不能访问 this ,只有 data 对象可供访问// 这个函数的返回值会被设置到 this.data.sum 字段中return data.a + data.b + data.sum // data.c 为自定义 behavior 数据段}},// 实现组件和 Store 的关联storeBindings: {store: numStore,// fields 和 actions 有两种写法:数组写法 和 对象写法// 数组写法fields: ['numA', 'numB', 'sum'],actions: ['update']} })
-
使用了
ComponentWithComputed
方法构建组件,Mobx写法使用旧版API
import { ComponentWithComputed } from 'miniprogram-computed'// 导入 storeBindingsBehavior 方法实现组件和 Store 的关联 import { storeBindingsBehavior } from "mobx-miniprogram-bindings" // 导入 Store import { numStore } from '../../stores/numstore'ComponentWithComputed({behaviors: [storeBindingsBehavior],data: {a: 1,b: 1,sum: 2},watch: {'a, b': function (a, b) {this.setData({total: a + b})}},computed: {total(data) {// 注意: computed 函数中不能访问 this ,只有 data 对象可供访问// 这个函数的返回值会被设置到 this.data.sum 字段中return data.a + data.b + data.sum // data.c 为自定义 behavior 数据段}},// 实现组件和 Store 的关联storeBindings: {store: numStore,// fields 和 actions 有两种写法:数组写法 和 对象写法// 数组写法fields: ['numA', 'numB', 'sum'],actions: ['update']} })
相关文章:
微信小程序 --- mobx-miniprogram miniprogram-computed
1.1 mobx-miniprogram 介绍 目前已经学习了 6 种小程序页面、组件间的数据通信方案,分别是: 数据绑定:properties获取组件实例:this.selectComponent()事件绑定:this.triggerEvent()获取应用实例:getApp(…...

【HTML】HTML基础2(一些常用标签)
目录 例子 首先是网页图标 然后是一些常用标签 插入图片 例子 <!DOCTYPE html> <html><head><link rel"icon" href"img/银河护卫队-星爵.png" type"image/x-icon"><meta charset"utf-8"><title>…...

Jmeter 安装
JMeter是Java的框架,因此在安装Jmeter前需要先安装JDK,此处安装以Windows版为例 1. 安装jdk:Java Downloads | Oracle 安装完成后设置环境变量 将环境变量JAVA_HOME设置为 C:\Program Files\Java\jdk1.7.0_25 在系统变量Path中添加 C:\Pro…...

控制液压比例插装阀放大器
比例阀放大器接收来自控制器的低功率电信号,并将其转换为足以驱动比例阀的高功率信号。与传统的开关型电磁铁不同,比例电磁铁可以实现连续控制,允许阀门在开和关之间进行无级调节,从而实现更精细的流量和压力控制。一个完整的电液…...

[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…...
nftables 测试一拒绝所有流量
要配置 nftables 先拒绝所有流量,然后再添加允许的规则,您可以按照以下步骤操作: 创建一个空的 nftables 配置文件(例如 /etc/nftables.conf)并添加如下内容: flush rulesettable inet filter {chain input…...

练习 3 Web [ACTF2020 新生赛]Upload
[ACTF2020 新生赛]Upload1 中间有上传文件的地方,试一下一句话木马 txt 不让传txt 另存为tlyjpg,木马文件上传成功 给出了存放目录: Upload Success! Look here~ ./uplo4d/06a9d80f64fded1e542a95e6d530c70a.jpg 下一步尝试改木马文件后缀…...
Linux中docker项目提示No such file or directory
本来以为是文件权限问题,后来发现是个非常蠢的问题 文件没有映射到容器中 docker文件映射语法 Docker 使用 -v 或 --volume 参数来指定文件映射。 增加在运行命令后 -v <宿主机目录>:<容器目录> 其中,宿主机目录 是指要映射的宿主机上的…...
PyTorch 中的 apply
Abstract nn.Module[List].apply(callable)Tensor.apply_(callable) → TensorFunction.apply(Tensor...) nn.Module[List].apply()? 源码: def apply(self: T, fn: Callable[[Module], None]) -> T:"""Typical use includes initializing the paramete…...

张宇30讲学习笔记
初等数学 x \sqrt{x} x 是算数平方根,一定≥0; x 2 \sqrt{x^2} x2 |x| x2|x2||x|2 x3≠|x3||x|3 不等式 a>0,b>0,则ab≥2 a b \sqrt{ab} ab 对数 ln a b \frac{a}{b} balna-lnb 高等数学 单调性 线性代数...

SpringBoot接口防抖(防重复提交)的一些实现方案
前言 啥是防抖 思路解析 分布式部署下如何做接口防抖? 具体实现 请求锁 唯一key生成 重复提交判断 前言 作为一名老码农,在开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统&a…...

Qt/C++音视频开发67-保存裸流加入sps/pps信息/支持264/265裸流/转码保存/拉流推流
一、前言 音视频组件除了支持保存MP4文件外,同时还支持保存裸流即264/265文件,以及解码后最原始的yuv文件。在实际使用过程中,会发现部分视频文件保存的裸流文件,并不能直接用播放器播放,查阅资料得知原来是缺少sps/p…...
【Web】速谈FastJson反序列化中TemplatesImpl的利用
目录 简要原理分析 exp 前文:【Web】关于FastJson反序列化开始前的那些前置知识 简要原理分析 众所周知TemplatesImpl的利用链是这样的: TemplatesImpl#getOutputProperties() -> TemplatesImpl#newTransformer() -> TemplatesImpl#getTransl…...
RK3568 RK809电源管理 RTC功能使能 定时唤醒
概述 RK809 是一款高性能 PMIC,RK809 集成 5 个大电流 DCDC、9 个 LDO、2 个 开关SWITCH、 1个 RTC、1个 高性能CODEC、可调上电时序等功能。 系统中各路电源总体分为两种:DCDC 和 LDO。两种电源的总体特性如下(详细资料请自行搜索): DCDC:输入输出压差大时,效率高,但…...

大模型(LLM)的token学习记录-I
文章目录 基本概念什么是token?如何理解token的长度?使用openai tokenizer 观察token的相关信息open ai的模型 token的特点token如何映射到数值?token级操作:精确地操作文本token 设计的局限性 tokenizationtoken 数量对LLM 的影响训练模型参…...

探索前景:机器学习中常见优化算法的比较分析
目录 一、介绍 二、技术背景 三、相关代码 四、结论 一、介绍 优化算法在机器学习和深度学习中至关重要,可以最小化损失函数,从而改善模型的预测。每个优化器都有其独特的方法来导航损失函数的复杂环境以找到最小值。本文探讨了一些最常见的优化算法&…...

基于MRI的阿尔兹海默症病情预测
《阿尔兹海默症病情预测系统:老年痴呆患者的福音》 引言项目背景和意义数据介绍与分析模型介绍模型训练与评估模型应用与展望 引言 阿尔兹海默症(Alzheimer’s Disease)是一种常见的老年疾病,给患者及其家庭带来了巨大的困扰和负…...

高维中介数据: 联合显着性(JS)检验法
摘要 中介分析在流行病学和临床试验中越来越受到关注。在现有的中介分析方法中,流行的联合显着性(JS)检验会产生过于保守的 I 类错误率,因此功效较低。但是,如果在使用 JS 测试高维中介假设时,可以准确控制…...

冒泡排序 和 qsort排序
目录 冒泡排序 冒泡排序部分 输出函数部分 主函数部分 总代码 控制台输出显示 总代码解释 冒泡排序优化 冒泡排序 主函数 总代码 代码优化解释 qsort 排序 qsort 的介绍 使用qsort排序整型数据 使用qsort排序结构数据 冒泡排序 首先,我先介绍我的冒泡…...
asp.net core webapi接收application/x-www-form-urlencoded和form-data参数
框架:asp.net core webapiasp.net core webapi接收参数,请求变量设置 目录 接收multipart/form-data、application/x-www-form-urlencoded类型参数接收URL参数接收上传的文件webapi接收json参数完整控制器,启动类参考Program.cs 接收multipar…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...