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


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 request函数 用来获取url参数
May 17 Javascript
js时间戳格式化成日期格式的多种方法
Nov 11 Javascript
Ext GridPanel加载完数据后进行操作示例代码
Jun 17 Javascript
排序算法的javascript实现与讲解(99js手记)
Sep 28 Javascript
关于延迟加载JavaScript
May 05 Javascript
分享jQuery插件的学习笔记
Jan 14 Javascript
Google 地图API Map()构造器详解
Aug 06 Javascript
PhotoSwipe异步动态加载图片方法
Aug 25 Javascript
BootStrap modal实现拖拽功能
Dec 01 Javascript
JS中封装axios来管控api的2种方式
Sep 11 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
Apr 24 Javascript
Javascript幻灯片播放功能实现过程解析
May 07 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中PDO的错误处理
2011/09/04 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
PHP使用redis位图bitMap 实现签到功能
2019/10/08 PHP
JQuery 国际象棋棋盘 实现代码
2009/06/26 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
javascript阻止scroll事件多次执行的思路及实现
2013/11/08 Javascript
jQuery探测位置的提示弹窗(toolTip box)详细解析
2013/11/14 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
浅谈Javascript中匀速运动的停止条件
2014/12/19 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
AngularJS执行流程详解
2017/02/17 Javascript
深入理解vue2.0路由如何配置问题
2017/07/18 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
python使用rsa加密算法模块模拟新浪微博登录
2014/01/22 Python
在Python中编写数据库模块的教程
2015/04/29 Python
python配置grpc环境
2019/01/01 Python
Python模拟登录和登录跳转的参考示例
2020/10/30 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
美国在线眼镜店:GlassesShop
2018/11/15 全球购物
推普周活动总结
2014/08/28 职场文书
私用公车造成事故检讨书
2014/11/16 职场文书
旷课检讨书范文
2015/01/27 职场文书
西安兵马俑导游词
2015/02/02 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
单位综合评价意见
2015/06/05 职场文书
Python数据分析之pandas读取数据
2021/06/02 Python
TS 类型收窄教程示例详解
2022/09/23 Javascript