让微信小程序页面之间的通信不在变得困难
一个开始
小程序开发者总会碰到各种页面之间的通信问题,实现方式也五花八门,比如...
场景还原
首先这是一个电商小程序。
有这样一个需求:
- 首页某个地方要展示购物车商品数量。
- 当我在其他页面加购了商品,首页数量刷新。
实现方式
- 方式一:onShow直接请求接口
Page({
onShow() {
// ...一些逻辑
// 后端请求新的购物车数量
this.requestCartNum();
}
})
不足: 每次onShow都要请求接口,浪费资源。
- 方式二:globalData存储购物车数量,onShow中做刷新
// 主页.js
Page({
onShow() {
// 在globalData获取到购物车数据
let num = globalData.cartNum;
if (num !== this.data.cartNum) {
this.setData({
cartNum: num,
});
}
}
}); // 加购页.js
Page({
// 加购后改变globalData的值
cartAdd(num) {
globalData.cartNum = globalData.cartNum + num;
}
})
- 方式三:加购后获取首页实例,调用首页方法
// 首页.js
Page({
onCartAdd(num) {
this.setData({
cartNum: this.data.cartNum + num,
});
},
}); // 加购页.js
Page({
onCartAdd(num) {
// 加购后获取到首页的实例,调用首页onCartAdd方法
let pages = getCurrentPages();
let curPage = pages[0];
curPage.onCartAdd(num);
}
})
不足:不确定能不能准确拿到首页的实例,如果换做其他页面就很难复用
- 方法四:事件订阅与发布
// 首页.js
Page({
onLoad() {
// 首页监听事件
this.$bus.on('cart_add', (num) => {
this.setData({
cartNum: this.data.cartNum + num,
})
})
}
}) // 加购页.js Page({
// 加购成功后触发cart_add事件
onCartAdd(num) {
this.$bus.emit('cart_add', num);
}
})
此方法用事件系统,订阅发布模式去做的处理。
以上几种方法中最优解决方案是方法四,利用事件的订阅与发布,逻辑清晰兼容性好。但是都不可避免的不足是:每一个需要动态显示购物数量的页面都需要添加相同的逻辑代码。
状态管理方案
单页应用中最常用的就是组件之间的通信,由此诞生了不同的状态存储方案: react用redux, vue用vuex。他们的思路都是类似的。都有一个核心 store 存储着一切要管理的状态。
那么,其他框架可以,小程序也可以。以redux为例,实现一套简单的状态管理方案。
wxdux的实现
使用前提:有redux基础
wxdux 类似与redux,以action来描述触发的行为,reducer来描述state的变化。
1. 小程序入口中注册
注册store并添加到globalData中去
import {createStore} from './wxdux/index';
import reducer from './reducer';
const store = createStore(reducer);
App({
globalData: {
store,
},
});
2. reducer实现
写法与redux类似,功能也类似。
const userReducer = (state = {}, action) => {
// ...
}
const postReducer = (state = [], action) => {
// ...
};
const reducers = {
user: userReducer,
posts: postReducer,
};
export default reducers;
3. 页面中使用wxdux
connect方法会将小程序页面实例与wxdux连接起来,必须提供$useState方法,该方法接收state,返回该页面所需要的state
import {connect} from './wxdux/index';
Page(connect({
data: {
sex: '男',
},
onLoad() {
// ...
},
$useState(state) {
return {
name: state.name,
},
},
}))
4. wxml中使用name
<view>{{name}}</view>
5. 触发store更新
使用dispatch方法,该方法接收一个对象作为参数,该对象必须包含type字段表示action的类型,wxdux会根据此action更新state并且刷新所有使用name的视图
import {dispatch} from './wxdux/index';
Page(connect({
// 某点击事件触发,更新姓名为“张三”
onClick() {
const updateName = {
type: 'update_name',
name: '张三'
};
dispatch(updateName);
}
}))
最后
让微信小程序页面之间的通信不在变得困难的更多相关文章
- 微信小程序——页面之间传递值
小程序页面传值的方式: 1.正向传值:上一页面 --> 下一页面 url传值 本地储存 全局的app对象 2.反向传值:下一页面 --> 上一页面 本地储存 全局的app对象 先说一下 ...
- 微信小程序页面之间的跳转
一.使用标签跳转 index.wxml: 在index.wxml页面添加一个<navigator>元素,在元素里面使用属性url就可以 二. ...
- 在微信小程序页面间传递数据总结
在微信小程序页面间传递数据 原文链接:https://www.jianshu.com/p/dae1bac5fc75 在开发微信小程序过程之中,遇到这么一些需要在微信小程序页面之间进行数据的传递的情况, ...
- [转] 微信小程序页面间通信的5种方式
微信小程序页面间通的5种方式 PageModel(页面模型)对小程序而言是很重要的一个概念,从app.json中也可以看到,小程序就是由一个个页面组成的. 如上图,这是一个常见结构的小程序:首页是一个 ...
- 微信小程序页面通信
目录 微信小程序页面通信 方式一:通过URL 方式二:通过全局变量 方式三:通过本地存储 方式四:通过路由栈 微信小程序页面通信 方式一:通过URL // A 页面 wx.navigateTo({ u ...
- 微信小程序--页面与组件之间如何进行信息传递和函数调用
微信小程序--页面与组件之间如何进行信息传递和函数调用 这篇文章我会以我自己开发经验从如下几个角度来讲解相关的内容 页面如何向组件传数据 组件如何向页面传数据 页面如何调用组件内的函数 组件如何调 ...
- 微信小程序与Java后台通信
一.写在前面 最近接触了小程序的开发,后端选择Java,因为小程序的代码运行在腾讯的服务器上,而我们自己编写的Java代码运行在我们自己部署的服务器上,所以一开始不是很明白小程序如何与后台进行通信的, ...
- 微信小程序页面跳转方法总结
微信小程序页面跳转目前有以下方法(不全面的欢迎补充): 1. 利用小程序提供的 API 跳转: // 保留当前页面,跳转到应用内的某个页面,使用wx.navigateBack可以返回到原页面.// 注 ...
- 微信小程序页面调用自定义组件内的事件
微信小程序页面调用自定义组件内的事件 page page.json { "usingComponents": { "my-component": ". ...
随机推荐
- Java构造函数(构造器)
构造函数是用于在对象创建后立即初始化对象的代码块.构造函数的结构看起来类似于一个方法. 声明构造函数 构造函数声明的一般语法是: 1 2 3 <Modifiers> <Constru ...
- apache2.2.25+tomcat7.0.47集群方案
因为公司项目在线人数的增加,随着现在硬件成本越来越低,大多数的生产环境内存大多都已经达到 16G,尤其最新的阿里云,客户的机器都是配置超高的java主机,但是Java的运行环境,内存使用有限 ,这样就 ...
- vue项目工具文件utils.js javascript常用工具类,javascript常用工具类,util.js
vue项目工具文件utils.js :https://blog.csdn.net/Ajaxguan/article/details/79924249 javascript常用工具类,util.js : ...
- pyhon if分支
在python中,最常用的就是if判断,if判断可以分为单次判断和多次判断 单次判断 if 条件 : (条件成立执行我) else:(else也可以没有,最近的else对应最近的if语句) (条件 ...
- 循序渐进学.Net Core Web Api开发系列【17】:.Net core自动作业之Hangfire
nuget搜索:Hangfire 安装即可,这里我选择的是 1.7.0-beta1 版本 我是用这个集成到了 mvc api里 这里需要在 Startup 文件里进行如下配置 在配置方法 Config ...
- ionic3.0 alipay-base插件移除后会添加多余的链接文件在nodes-modules中,导致再安装其他插件或移除插件时报错问题
1.报错截图: 2.如图因为nodes-module 文件夹中有多余的链接文件导致报错. 3.解决方法:将该链接文件删除即可.
- 【JS学习】慕课网9-14 删除结点操作的问题
试一试,定义clearText()函数,完成节点内容的删除. 1. 删除该节点的内容,先要获取子节点. 2. 然后使用循环遍历每个子节点. 3. 使用removeChild()删除节点. 特别要注意的 ...
- robotframework+python3+selenium之web相关关键字---第二集
1.F5可查看所有关键字,如图: 2.浏览器相关关键字: 2.1 Open Browser https://www.baidu.com chrome # 打开浏览器,rf默认使用火狐浏 ...
- war包里面文件的修改方式
1 将war包移动到一个干净的路径下,使用 jar xvf ROOT.war 命令将war进行解压操作 2 修改相应的文件内容,修改想要修改的文件,比如web.xml 3 使用 j ...
- linux安装zabbix的tar包和另外一个并存
在安装zabbix客户端的时候,发现存在一个zabbix客户端,现在我们要重新建一个来与之并存 第一步安装: cd /data0/software/ tar xf zabbix-3.0.28.tar. ...