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


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 相关文章推荐
广告代码静态化js通用函数
May 09 Javascript
浏览器打开层自动缓慢展开收缩实例代码
Jul 04 Javascript
jquery提示效果实例分析
Nov 25 Javascript
JavaScript实现在页面间传值的方法
Apr 07 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
May 10 Javascript
阻止表单提交按钮多次提交的完美解决方法
May 16 Javascript
值得分享的Bootstrap Table使用教程
Nov 23 Javascript
javascript html5轻松实现拖动功能
Mar 01 Javascript
VUE页面中加载外部HTML的示例代码
Sep 20 Javascript
vue中slot(插槽)的介绍与使用
Nov 12 Javascript
vue不操作dom实现图片轮播的示例代码
Dec 18 Javascript
vue实现简单跑马灯效果
May 25 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
PHP 抓取新浪读书频道的小说并生成txt电子书的代码
2009/12/18 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
Laravel5.1 框架表单验证操作实例详解
2020/01/07 PHP
js 操作符实例代码
2009/10/24 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
微信JS接口汇总及使用详解
2015/01/09 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
node结合swig渲染摸板的方法
2018/04/11 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
详解VUE Element-UI多级菜单动态渲染的组件
2019/04/25 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
2020/05/23 Javascript
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
Python脚本实现下载合并SAE日志
2015/02/10 Python
Python中列表元素转为数字的方法分析
2016/06/14 Python
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
浅析Git版本控制器使用
2017/12/10 Python
python 把列表转化为字符串的方法
2018/10/23 Python
pyQT5 实现窗体之间传值的示例
2019/06/20 Python
Python中url标签使用知识点总结
2020/01/16 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
在python下实现word2vec词向量训练与加载实例
2020/06/09 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
selenium+超级鹰实现模拟登录12306
2021/01/24 Python
Python爬虫UA伪装爬取的实例讲解
2021/02/19 Python
animation和transition的区别
2020/10/12 HTML / CSS
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
外国语学院毕业生自荐信
2013/10/28 职场文书
大学生学业生涯规划
2014/01/05 职场文书
详解Python中*args和**kwargs的使用
2022/04/07 Python