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


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 相关文章推荐
Jquery中对数组的操作代码
Aug 12 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
Dec 30 Javascript
微信小程序 网络API发起请求详解
Nov 09 Javascript
js前端解决跨域问题的8种方案(最新最全)
Nov 18 Javascript
javascript中闭包概念与用法深入理解
Dec 15 Javascript
JS实现间歇滚动的运动效果实例
Dec 22 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
Jun 09 Javascript
详解Vue双向数据绑定原理解析
Sep 11 Javascript
基于滚动条位置判断的简单实例
Dec 14 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
Feb 26 Javascript
Vue3.0结合bootstrap创建多页面应用
May 28 Javascript
在vue中使用image-webpack-loader实例
Nov 12 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
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
Javascript-Mozilla和IE中的一个函数直接量的问题分析
2007/08/12 Javascript
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
关于Javascript模块化和命名空间管理的问题说明
2010/12/06 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
详解angularjs结合pagination插件实现分页功能
2017/02/10 Javascript
如何编写jquery插件
2017/03/29 jQuery
jQuery实现select下拉框获取当前选中文本、值、索引
2017/05/08 jQuery
前端把html表格生成为excel表格的实例
2017/09/19 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
Angular网络请求的封装方法
2018/05/22 Javascript
微信小程序实现团购或秒杀批量倒计时
2020/11/01 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
Vue请求JSON Server服务器数据的实现方法
2018/11/02 Javascript
JQuery特殊效果和链式调用操作示例
2019/05/13 jQuery
通过实例学习React中事件节流防抖
2019/06/17 Javascript
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
Django中使用group_by的方法
2015/05/26 Python
判断python字典中key是否存在的两种方法
2018/08/10 Python
Python简单I/O操作示例
2019/03/18 Python
python实现银行管理系统
2019/10/25 Python
如何使用python进行pdf文件分割
2019/11/11 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
python数据类型强制转换实例详解
2020/06/22 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
CSS3中的transform属性进行2D和3D变换的基本用法
2016/05/12 HTML / CSS
Lungolivigno Fashion官网:高级时装在线购物
2020/10/17 全球购物
小学科学教学反思
2014/01/26 职场文书
护士毕业生自我鉴定
2014/02/08 职场文书
升职感谢信
2015/01/22 职场文书
三孔导游词
2015/02/05 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers