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


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中Iframe之间传值的方法
Mar 11 Javascript
js文件包含的几种方式介绍
Sep 28 Javascript
用Move.js配合创建CSS3动画的入门指引
Jul 22 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
Oct 09 Javascript
javascript实现不同颜色Tab标签切换效果
Apr 27 Javascript
jQuery插件Validation快速完成表单验证的方式
Jul 28 Javascript
基于jQuery实现表格内容的筛选功能
Aug 21 Javascript
原生javascript实现的全屏滚动功能示例
Sep 19 Javascript
webstorm添加*.vue文件支持
May 08 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
Sep 02 Javascript
解决vue动态为数据添加新属性遇到的问题
Sep 18 Javascript
Javascript Symbol原理及使用方法解析
Oct 22 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
DC动漫人物排行
2020/03/03 欧美动漫
php批量删除超链接的实现方法
2015/10/19 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
php实现留言板功能(会话控制)
2017/05/23 PHP
phpinfo无法显示的原因及解决办法
2019/02/15 PHP
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
JavaScript 常用函数
2009/12/30 Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
JavaScript中判断页面关闭、页面刷新的实现代码
2014/08/27 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
谈谈我对JavaScript DOM事件的理解
2015/12/18 Javascript
JavaScript中的Object对象学习教程
2016/05/20 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
微信小程序实战篇之购物车的实现代码示例
2017/11/30 Javascript
selenium+java中用js来完成日期的修改
2019/10/31 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
使用Python将数组的元素导出到变量中(unpacking)
2016/10/27 Python
详解Python中的正则表达式
2018/07/08 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
python 产生token及token验证的方法
2018/12/26 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
vscode配置anaconda3的方法步骤
2020/08/08 Python
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
给交警的表扬信
2014/01/12 职场文书
关于青春的演讲稿
2014/05/05 职场文书
大学生安全责任书
2014/07/25 职场文书
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
2014年团支部工作总结
2014/11/17 职场文书
2015年毕业生实习评语
2015/03/25 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
Java Dubbo框架知识点梳理
2021/06/26 Java/Android