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


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 相关文章推荐
js传值 判断
Oct 26 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
Jun 27 Javascript
jquery load事件(callback/data)使用方法及注意事项
Feb 06 Javascript
jQuery控制网页打印指定区域的方法
Apr 07 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
Aug 24 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
Mar 10 Javascript
angular指令笔记ng-options的使用方法
Sep 18 Javascript
AngualrJs清除定时器遇到的坑
Oct 13 Javascript
Angular4的输入属性与输出属性实例详解
Nov 29 Javascript
原生JavaScript实现todolist功能
Mar 02 Javascript
Node 搭建一个静态资源服务器的实现
May 20 Javascript
JavaScript高级程序设计之变量与作用域
Nov 17 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
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
深入解析php之sphinx
2013/05/15 PHP
php中adodbzip类实例
2014/12/08 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
2019/10/16 PHP
php解析非标准json、非规范json的方式实例
2020/12/10 PHP
网页自动刷新,不产生嗒嗒声的一个解决方法
2007/03/27 Javascript
权威JavaScript 中的内存泄露模式
2007/08/13 Javascript
Javascript 读书笔记索引贴
2010/01/11 Javascript
在javascript中关于节点内容加强
2013/04/11 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
js获取控件位置以及不同浏览器中的差别介绍
2013/08/08 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
详解vue-cli构建项目反向代理配置
2017/09/07 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
高效jQuery选择器的5个技巧实例分析
2019/11/26 jQuery
JS如何把字符串转换成json
2020/02/21 Javascript
原生JS封装拖动验证滑块的实现代码示例
2020/06/01 Javascript
使用python为mysql实现restful接口
2018/01/05 Python
python组合无重复三位数的实例
2018/11/13 Python
对python周期性定时器的示例详解
2019/02/19 Python
jupyter lab文件导出/下载方式
2020/04/22 Python
python怎么删除缓存文件
2020/07/19 Python
利用Python如何制作贪吃蛇及AI版贪吃蛇详解
2020/08/24 Python
Python实现自动装机功能案例分析
2020/10/22 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
2020/11/13 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
Java如何格式化日期
2012/08/07 面试题
优秀大学生推荐信范文
2013/11/28 职场文书
小学国庆节活动方案
2014/02/11 职场文书
科学育儿宣传标语
2014/10/08 职场文书
公司晚宴祝酒词
2015/08/11 职场文书
nginx共享内存的机制详解
2022/03/21 Servers