详解小程序不同页面之间通讯的解决方案


Posted in Javascript onNovember 23, 2018

小程序做开发的时候难免需要不同页面之间的通讯,比如首页打开新的页面搜索获取结果返回到首页,不同tab页面之间的数据交互等等。于是做了以下总结

当前页面打开新的页面

打开新的页面可以通过 navigator 组件来实现,通过url传参来实现,例如

<navigator url="../search/search?id=123" open-type="redirect">搜索</navigator>

在新的页面 onLoad 事件可以拿到传过来的参数 options

onLoad: function(options) {
 console.log(options.id);
}

新的页面回传数据到当前页面

在当前页面定义一个方法

searchRet(results) {
 console.log(results);
}

在搜索页面获取到的结果,由于小程序页面是通过栈来存储的,所以可以通过 getCurrentPages() 获取获取当前页面栈的实例,第一个元素为首页,最后一个元素为当前页面

let pages = getCurrentPages();
let homePage = pages[pages.length - 2];
if (homePage) {
 homePage.searchRet(results);
}

生命周期和storage

通过 wx.setStorageSync() 方法可以在本地存储数据,在 page 的 onShow 回调里获取 storage 的值后做相应的处理,例如

// index.js
wx.setStorageSync('refresh', true);

// mycenter.js
if (wx.getStorageSync('refresh')) {
 // 做更新操作
 wx.removeStorageSync('refresh');
}

storage 也可以用 globalData 来代替,原理一样,这里不做展开,两种办法都可行,但是就是太笨了,场景复杂起来没法搞 ?

事件监听

个人感觉通过全局的事件监听来处理是一个很好的方法,在 Page 页面监听事件,通过在另一个 Page 触发相应的事件,就可以做对应的处理,实时高效,于是我封装了一个可以声明命名空间的事件监听器 nsevent ,可以通过 npm 安装到小程序(微信官方npm使用方法)

nsevent的用法也很简单,只需要在监听的页面通过 nsevent.on() 来实现监听,建议添加第三个参数命名空间,这样可以在 onUnload 回调解绑相应的事件,举个以下例子

// select.js
const nsevent = require('nsevent');
Page({
 onLoad() {
  nsevent.on('add', (num) => {
   console.log(`select.js接收到add事件,参数为${num}`)
  }, 'select.js')
 },
 addnumber() {
  nsevent.emit('add', 1);
 },
 onUnload() {
  console.log('select.js移除add事件')
  nsevent.off('add', 'select.js');
 }
});

emit方法不仅可以触发普通的事件,也可以触发指定命名空间的事件,比如 pageA 和 pageB,pageC 都监听了 locationChange 事件,在 pageC 页面想单独触发 pageA 的回调,可以这样写 ?

nsevent.emit('locationChange', { ns: ['pageA'] });

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

Javascript 相关文章推荐
jQuery的实现原理的模拟代码 -5 Ajax
Aug 07 Javascript
javascript学习笔记(一) 在html中使用javascript
Jun 18 Javascript
JS对select控件option选项的增删改查示例代码
Oct 21 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
Dec 17 Javascript
使用Web Uploader实现多文件上传
Jun 08 Javascript
Angular2.js实现表单验证详解
Jun 23 Javascript
React diff算法的实现示例
Apr 20 Javascript
详解vue-router数据加载与缓存使用总结
Oct 29 Javascript
Node.js+Express+Mysql 实现增删改查
Apr 03 Javascript
微信小程序实现拖拽功能
Sep 26 Javascript
JS使用正则表达式判断输入框失去焦点事件
Oct 16 Javascript
用javascript制作qq注册动态页面
Apr 14 Javascript
创建echart多个联动的示例代码
Nov 23 #Javascript
详解Angular模板引用变量及其作用域
Nov 23 #Javascript
vue使用better-scroll实现下拉刷新、上拉加载
Nov 23 #Javascript
详解Vue2.0组件的继承与扩展
Nov 23 #Javascript
angular4自定义表单控件[(ngModel)]的实现
Nov 23 #Javascript
详解Angular中实现自定义组件的双向绑定的两种方法
Nov 23 #Javascript
Vue.js组件间通信方式总结【推荐】
Nov 23 #Javascript
You might like
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
浅谈PHP 闭包特性在实际应用中的问题
2009/10/30 PHP
关于JSON以及JSON在PHP中的应用技巧
2013/11/27 PHP
PHP依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
PHP解决中文乱码
2017/04/28 PHP
javascript数组使用调用方法汇总
2007/12/08 Javascript
IE与firefox之jquery用法区别
2008/10/03 Javascript
ASP.NET jQuery 实例14 在ASP.NET form中校验时间范围
2012/02/03 Javascript
js特殊字符转义介绍
2013/11/05 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
a标签的href与onclick事件的区别详解
2014/11/12 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
Angular.js实现注册系统的实例详解
2016/12/18 Javascript
vue.js实现点击后动态添加class及删除同级class的实现代码
2018/04/04 Javascript
vue项目部署到Apache服务器中遇到的问题解决
2018/08/24 Javascript
vue 项目中使用Loading组件的示例代码
2018/08/31 Javascript
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
JS实现判断数组是否包含某个元素示例
2019/05/24 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
Vue实现渲染数据后控制滚动条位置(推荐)
2019/12/09 Javascript
JavaScript实现沿五角星形线摆动的小圆实例详解
2020/07/28 Javascript
Node.js文本文件BOM头的去除方法
2020/11/22 Javascript
Python版微信红包分配算法
2015/05/04 Python
Python实现k-means算法
2018/02/23 Python
Python hashlib模块实例使用详解
2019/12/24 Python
python基于opencv检测程序运行效率
2019/12/28 Python
python实现用类读取文件数据并计算矩形面积
2020/01/18 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
html5新增的定时器requestAnimationFrame实现进度条功能
2018/12/13 HTML / CSS
把富文本的回车转为br标签
2019/08/09 HTML / CSS
外贸业务员岗位职责
2013/11/24 职场文书
《自然之道》教学反思
2014/02/11 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书