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


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 相关文章推荐
网页中CDATA标记的说明
Sep 12 Javascript
Javascript 面向对象(三)接口代码
May 23 Javascript
简述AngularJS相关的一些编程思想
Jun 23 Javascript
JS实现仿微博可关闭弹出层效果
Sep 21 Javascript
JavaScript数据推送Comet技术详解
Apr 07 Javascript
JQuery给select添加/删除节点的实现代码
Apr 26 Javascript
js获取Get值的方法
Sep 29 Javascript
JavaScript构建自己的对象示例
Nov 29 Javascript
echarts学习笔记之箱线图的分析与绘制详解
Nov 22 Javascript
微信小程序项目实践之验证码倒计时功能
Jul 18 Javascript
玩转Koa之核心原理分析
Dec 29 Javascript
vue-router重定向和路由别名的使用讲解
Jan 19 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
php 格式化数字的时候注意数字的范围
2010/04/13 PHP
PHP得到某段时间区间的时间戳 php定时任务
2012/04/12 PHP
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
php 5.6版本中编写一个PHP扩展的简单示例
2015/01/20 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
浅谈php调用python文件
2019/03/29 PHP
JavaScript 继承详解(四)
2009/07/13 Javascript
在css加载完毕后自动判断页面是否加入css或js文件
2014/09/10 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
2016/08/25 Javascript
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
微信小程序 引入es6 promise
2017/04/12 Javascript
详解Angular 4.x 动态创建组件
2017/04/25 Javascript
vue 将页面公用的头部组件化的方法
2017/12/18 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
jquery实现垂直手风琴菜单
2020/03/04 jQuery
vue 弹出遮罩层样式实例
2020/07/22 Javascript
[01:01:24]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python的time模块中的常用方法整理
2015/06/18 Python
python一键去抖音视频水印工具
2018/09/14 Python
python将unicode和str互相转化的实现
2020/05/11 Python
Python reversed反转序列并生成可迭代对象
2020/10/22 Python
用python写PDF转换器的实现
2020/10/29 Python
天巡全球:Skyscanner Global
2017/06/20 全球购物
Aosom西班牙:家具在线商店
2020/06/11 全球购物
中学教师岗位职责
2013/11/26 职场文书
会议邀请书范文
2014/02/02 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
希特勒经典演讲稿
2014/05/19 职场文书
个人委托书范本汇总
2014/10/01 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
导游词之安徽九华山
2019/09/18 职场文书
七年级作文之秋游
2019/10/21 职场文书
Vue全家桶入门基础教程
2021/05/14 Vue.js
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python