如何让微信小程序页面之间的通信不再变困难


Posted in Javascript onJune 03, 2019

一个开始

小程序开发者总会碰到各种页面之间的通信问题,实现方式也五花八门,比如...

场景还原

首先这是一个电商小程序。

有这样一个需求:

  • 首页某个地方要展示购物车商品数量。
  • 当我在其他页面加购了商品,首页数量刷新。

实现方式

方式一: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);
 }
}))

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
深入分析js的冒泡事件
Dec 05 Javascript
JavaScript学习笔记之JS函数
Jan 22 Javascript
kindeditor修复会替换script内容的问题
Apr 03 Javascript
jQuery 监控键盘一段时间没输入
Apr 22 Javascript
VUEJS实战之利用laypage插件实现分页(3)
Jun 13 Javascript
Node.js利用console输出日志文件的方法示例
Apr 27 Javascript
微信小程序实现漂亮的弹窗效果
May 26 Javascript
ES6 Map结构的应用实例分析
Jun 26 Javascript
el-select 下拉框多选实现全选的实现
Aug 02 Javascript
小程序跳转H5页面的方法步骤
Mar 06 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
Aug 14 Javascript
在vue中使用Echarts画曲线图的示例
Oct 03 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
Jun 03 #Javascript
使用watch在微信小程序中实现全局状态共享
Jun 03 #Javascript
深入理解JS异步编程-Promise
Jun 03 #Javascript
模块化react-router配置方法详解
Jun 03 #Javascript
react 组件传值的三种方法
Jun 03 #Javascript
angular使用md5,CryptoJS des加密的方法
Jun 03 #Javascript
Node.js 的 GC 机制详解
Jun 03 #Javascript
You might like
星际争霸任务指南——虫族
2020/03/04 星际争霸
桌面中心(一)创建数据库
2006/10/09 PHP
ThinkPHP3.1新特性之多层MVC的支持
2014/06/19 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
Yii实现文章列表置顶功能示例
2016/10/18 PHP
mapper--图片热点区域高亮组件官方站点
2007/12/22 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
2013/03/05 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
Vue.js 2.5新特性介绍(推荐)
2017/10/24 Javascript
Angular 4中如何显示内容的CSS样式示例代码
2017/11/06 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
Node中使用ES6语法的基础教程
2018/01/05 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
javascript实现点击星星小游戏
2019/12/24 Javascript
uniapp实现可滑动选项卡
2020/10/21 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
python判断windows隐藏文件的方法
2014/03/21 Python
Python中对列表排序实例
2015/01/04 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
解决Django Haystack全文检索为空的问题
2020/05/19 Python
Nike墨西哥官网:Nike MX
2020/08/30 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
上课看小说检讨书
2014/02/22 职场文书
企业道德讲堂实施方案
2014/03/19 职场文书
司机岗位职责说明书
2014/07/29 职场文书
职工小家建设活动方案
2014/08/25 职场文书
运动会通讯稿100字
2015/07/20 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
java版 联机五子棋游戏
2022/05/04 Java/Android