让微信小程序页面之间的通信不在变得困难
一个开始
小程序开发者总会碰到各种页面之间的通信问题,实现方式也五花八门,比如...
场景还原
首先这是一个电商小程序。
有这样一个需求:
- 首页某个地方要展示购物车商品数量。
- 当我在其他页面加购了商品,首页数量刷新。
实现方式
- 方式一: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": ". ...
随机推荐
- centos 7 安装mysql5.7
1.进入到要存放安装包的位置 cd /home/lnmp 2.查看系统中是否已安装 MySQL 服务,以下提供两种方式: rpm -qa | grep mysql yum list installed ...
- 获取项目根目录(非tomact)
String path; public void main(String[] args) { File file=new File(""); path=file.getAbsolu ...
- 关于JS递归函数求斐波那契数列两种实现方法
百度已经解释的很详细了,但是不写注释还真是看不懂,递归,就直接套公式了,for循坏,我们就用EXCEL看一下规律 可以看到B是A+B的和,A往后就是B的值,所以我们需要第三个变量来保存他们的和,取出B ...
- Clairewd's message /// 字符串hash
题目大意: 给定字符串s 是26个字母对应的密文字母 给定字符串c1 是 密文+部分原文 原文可能缺损 要求将原文补全输出 利用s得到密文字母对应的原字母rs 利用rs翻译c1得到 原文+部分密文c2 ...
- ionic3 多级联动城市选择插件 ion-multi-picker
1.效果演示 2.npm安装扩展包依赖 ion-multi-picker 组件 npm install ion-multi-picker --save 3.在app.module.ts中导入插件模块 ...
- 理解Java GC日志
idea 在vm options处加入-XX:+PrintGCDetails,可打印GC日志. public class ReferenceCountingGC { public Object ins ...
- 将Eclipse项目转换成AndroidStudio项目过程中遇到的问题以及解决方法
将Eclipse项目转换成AndroidStudio项目也不是第一次了,昨天转的时候遇到几个问题: 首先将项目导入androidstudio,导完后报错: 问题一: Error:java.util.c ...
- Linux解压rar文件
Linux解压rar文件(unrar安装和使用,分卷解压) windows平台很多压缩文档为rar文件,那么怎么做到Linux解压rar文件(unrar安装和使用)? 简单,centos5安装unra ...
- Spring下载maven
http://maven.springframework.org/release/org/springframework/spring/
- 异步ajax请求数据处理
jQuery.ajax(url,[settings]) 概述 通过 HTTP 请求加载远程数据. jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax ...