百度小程序之间的页面通信过程详解


Posted in Javascript onJuly 18, 2019

背景

主要是针对小程序开发中页面之间进行通信的问题,在涉及支付的场景中,用户从页面支付入口进行跳转进行支付之后,回到原来页面,在原来的页面需要进行相应的状态刷新,比如用户身份状态、支付状态、文档或商品情况。

遇到的问题

在使用百度小程序的 swan.navigateBack 进行回跳页面时,API中的方法参数不支持携带参数,只支持number参数。

所以就涉及了几个单独页面之间的通信问题。如下主要列出了几个方法,供参考。

swan.navigateBack

参数名 类型 必填 默认值 说明
delta Number 1 返回的页面数,如果 delta 大于现有页面数,则返回到首页1。
success function - 接口调用成功的回调函数
fail function - 接口调用失败的回调函数
complete function - 接口调用结束的回调函数(调用成功、失败都会执行)

解决方法

主要有以下三种方法,实现各page之间通信。

解决方法一:利用app.js,设置公共变量

利用app.js的公共特性,将变量挂在APP上。

// app.js 启动文件
App({
 globalData: {
  isLogin: false,
  userInfo: null,
  networkError: false,
  networkType: 'none'
 }
})

在其他页面Page上使用时,使用:

// test.js
const app = getApp();
const commonParams = app.globalData.isLogin;

但是存在的缺点也十分明显,当数据量比较大、数据关系比较复杂时,维护会比较复杂,逻辑会很混乱。

解决方法二:利用storage

利用小程序的全局storage,对数据进行存取,原理类似于解决方案一。

// 存储-异步
swan.setStorage({
 key: 'key',
 data: 'value'
});
// 存储-同步
swan.setStorageSync('key', 'value');

// 获取-异步
swan.getStorage({
 key: 'key',
 success: function (res) {
  console.log(res.data);
 },
 fail: function (err) {
  console.log('错误码:' + err.errCode);
  console.log('错误信息:' + err.errMsg);
 }
});

// 获取-同步
const result = swan.getStorageSync('key');

解决方法三: 利用事件中心

利用事件中心的进行订阅和发布。

// event.js 事件中心

class Event {
 on(event, fn, ctx) {
  if (typeof fn !== 'function') {
   console.error('fn must be a function');
   return;
  }

  this._stores = this._stores || {};
  (this._stores[event] = this._stores[event] || []).push({
   cb: fn,
   ctx: ctx
  });
 }
 emit(event, ...args) {
  this._stores = this._stores || {};
  let store = this._stores[event];
  if (store) {
   store = store.slice(0);
   for (let i = 0, len = store.length; i < len; i++) {
    store[i].cb.apply(store[i].ctx, args);
   }
  }
 }
 off(event, fn) {
  this._stores = this._stores || {};
  // all
  if (!arguments.length) {
   this._stores = {};
   return;
  }
  // specific event
  let store = this._stores[event];
  if (!store) {
   return;
  }
  // remove all handlers
  if (arguments.length === 1) {
   delete this._stores[event];
   return;
  }
  // remove specific handler
  let cb;
  for (let i = 0, len = store.length; i < len; i++) {
   cb = store[i].cb;
   if (cb === fn) {
    store.splice(i, 1);
    break;
   }
  }
  return;
 }
}

module.exports = Event;

在app.js中进行声明和管理

// app.js
import Event from './utils/event';

App({
 event: new Event()
})

订阅的页面中,使用on方法进行订阅

// view.js 阅读页进行订阅

Page({
 // 页面在回退时,会调用onShow方法
 onShow() {
  // 支付成功的回调,调起下载弹层
  app.event.on('afterPaySuccess', this.afterPaySuccess, this);
 },
 afterPaySuccess(e) {
  // ....业务逻辑
 }
})

发布的页面中,根据业务情况进行发布emit

// paySuccess.js

const app = getApp();

app.event.emit('afterPaySuccess', {
 docId: this.data.tradeInfo.docId,
 triggerFrom: 'docCashierBack'
});

根据事件中心的发布和订阅,实现了页面之间的通信,就能实现比如页面在支付成功后回退时,页面状态的改变的场景,同时利于维护页面之间的数据关系,能通过在发布时传递参数,实现数据之间的通信。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jquery的Repeater实现代码
Jul 17 Javascript
javascript 事件绑定问题
Jan 01 Javascript
Javascript中的匿名函数与封装介绍
Mar 15 Javascript
Jquery使用css方法改变样式实例
May 18 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
Aug 31 Javascript
原生js实现选项卡功能
Mar 08 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
Apr 27 Javascript
利用Angular2 + Ionic3开发IOS应用实例教程
Jan 15 Javascript
Layui实现带查询条件的分页
Jul 27 Javascript
element-ui 实现响应式导航栏的示例代码
May 08 Javascript
微信小程序实现时间戳格式转换
Jul 20 Javascript
JavaScript实现拖拽和缩放效果
Aug 24 Javascript
微信小程序如何获取群聊的openGid以及名称详解
Jul 17 #Javascript
vue+django实现一对一聊天功能的实例代码
Jul 17 #Javascript
微信小程序从注册账号到上架(图文详解)
Jul 17 #Javascript
js设置默认时间跨度过程详解
Jul 17 #Javascript
Vue 前端实现登陆拦截及axios 拦截器的使用
Jul 17 #Javascript
初试vue-cli使用HBuilderx打包app的坑
Jul 17 #Javascript
移动端吸顶fixbar的解决方案详解
Jul 17 #Javascript
You might like
cmd下运行php脚本
2008/11/25 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
php设计模式之命令模式使用示例
2014/03/02 PHP
php递归遍历删除文件的方法
2015/04/17 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
PHP常见数组排序方法小结
2018/08/20 PHP
在 Laravel 中动态隐藏 API 字段的方法
2019/10/25 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
Js之软键盘实现(js源码)
2007/01/30 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
jQuery操作input type=radio的实现代码
2012/06/14 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
2012/11/08 Javascript
js 窗口抖动示例
2013/09/04 Javascript
JavaScript中判断整数的多种方法总结
2014/11/08 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
javascript实现九宫格相加数值相等
2020/05/28 Javascript
js中的关联数组与普通数组详解
2016/07/27 Javascript
JS+Canvas绘制动态时钟效果
2017/11/10 Javascript
mpvue小程序仿qq左滑置顶删除组件
2018/08/03 Javascript
详解JWT token心得与使用实例
2019/08/02 Javascript
jquery树形插件zTree高级使用详解
2019/08/16 jQuery
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
javascript实现文字跑马灯效果
2020/06/18 Javascript
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
python中logging模块的一些简单用法的使用
2019/02/22 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
Python 内置函数globals()和locals()对比详解
2019/12/23 Python
Python 解析pymysql模块操作数据库的方法
2020/02/18 Python
西班牙在线宠物商店:zooplus.es
2017/02/24 全球购物
欧洲顶级的童装奢侈品购物网站:Bambini Fashion(面向全球)
2018/04/24 全球购物
办公室文秘自我鉴定
2013/09/21 职场文书
综合测评自我鉴定
2013/10/08 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
自我鉴定书
2014/03/24 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server