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


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 相关文章推荐
在html页面中包含共享页面的方法
Oct 24 Javascript
基于Jquery实现的一个图片滚动切换
Jun 21 Javascript
用javascript添加控件自定义属性解析
Nov 25 Javascript
用于deeplink的js方法(判断手机是否安装app)
Apr 02 Javascript
基于insertBefore制作简单的循环插空效果
Sep 21 Javascript
如何利用AngularJS打造一款简单Web应用
Dec 05 Javascript
AngularJS 日期格式化详解
Dec 23 Javascript
JavaScript判断表单为空及获取焦点的方法
Feb 12 Javascript
浅析jquery unbind()方法移除元素绑定的事件
May 24 Javascript
微信小程序中input标签详解及简单实例
May 18 Javascript
Javascript实现简易天数计算器
May 18 Javascript
vue项目多环境配置(.env)的实现
Jul 21 Vue.js
使用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
深入PHP5中的魔术方法详解
2013/06/17 PHP
php语言中使用json的技巧及json的实现代码详解
2015/10/27 PHP
PHP使用redis消息队列发布微博的方法示例
2017/06/22 PHP
ThinkPHP6.0如何利用自定义验证规则规范的实现登陆
2020/12/16 PHP
Jquery图片滚动与幻灯片的实例代码
2013/04/08 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
jQuery拖拽排序插件制作拖拽排序效果(附源码下载)
2016/02/23 Javascript
使用JS实现图片展示瀑布流效果的实例代码
2016/09/12 Javascript
js实现手机拍照上传功能
2017/01/17 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
对vue下点击事件传参和不传参的区别详解
2018/09/15 Javascript
JS实现判断数组是否包含某个元素示例
2019/05/24 Javascript
python snownlp情感分析简易demo(分享)
2017/06/04 Python
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
python删除文本中行数标签的方法
2018/05/31 Python
Python补齐字符串长度的实例
2018/11/15 Python
python中的列表与元组的使用
2019/08/08 Python
Python超越函数积分运算以及绘图实现代码
2019/11/20 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
python和opencv构建运动检测器的实现
2021/03/03 Python
HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
2014/04/10 HTML / CSS
Stio官网:男女、儿童户外服装
2019/12/13 全球购物
个人简历自荐信
2013/12/05 职场文书
老师自我鉴定范文
2013/12/25 职场文书
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
百日安全活动总结
2014/05/04 职场文书
护士节活动总结
2014/08/29 职场文书
2014年党员整改措施
2014/10/24 职场文书
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫