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


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 相关文章推荐
My Desktop :) 桌面式代码
Dec 29 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
Mar 29 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
Jun 08 Javascript
页面实时更新时间的JS实例代码
Dec 18 Javascript
利用js正则表达式验证手机号,email地址,邮政编码
Jan 23 Javascript
jQuery EasyUI Draggable拖动组件
Mar 01 Javascript
关于Vue实现组件信息的缓存问题
Aug 23 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
Dec 01 Javascript
原生js实现简单的焦点图效果实例
Dec 14 Javascript
微信小程序实现人脸检测功能
May 25 Javascript
JS实现的排列组合算法示例
Jul 16 Javascript
在微信小程序中渲染HTML内容3种解决方案及分析与问题解决
Jan 12 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
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
PHP函数shuffle()取数组若干个随机元素的方法分析
2016/04/02 PHP
分享php多功能图片处理类
2016/05/15 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
js中split和replace的用法实例
2015/02/28 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
2016/03/28 Javascript
jQuery简单实现彩色云标签效果示例
2016/08/01 Javascript
微信小程序实现图片轮播及文件上传
2017/04/07 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
Node.js 的模块知识汇总
2017/08/16 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
Vue CLI3基础学习之pages构建多页应用
2019/06/02 Javascript
jQuery实现checkbox全选、反选及删除等操作的方法详解
2019/08/02 jQuery
深入浅出vue图片路径的实现
2019/09/04 Javascript
vue.js实现只能输入数字的输入框
2019/10/19 Javascript
vue插槽slot的简单理解与用法实例分析
2020/03/14 Javascript
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
用Python中的__slots__缓存资源以节省内存开销的方法
2015/04/02 Python
python将ansible配置转为json格式实例代码
2017/05/15 Python
python3实现全角和半角字符转换的方法示例
2017/09/21 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
python调用API实现智能回复机器人
2018/04/10 Python
python中实现控制小数点位数的方法
2019/01/24 Python
python读取指定字节长度的文本方法
2019/08/27 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
python实现翻译word表格小程序
2020/02/27 Python
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
小学生运动会通讯稿
2014/09/23 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
pytorch中[..., 0]的用法说明
2021/05/20 Python
matplotlib画混淆矩阵与正确率曲线的实例代码
2021/06/01 Python