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


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 相关文章推荐
不同浏览器对回车提交表单的处理办法
Feb 13 Javascript
js网页侧边随页面滚动广告效果实现
Apr 14 Javascript
屏蔽网页右键复制和ctrl+c复制的js代码
Jan 04 Javascript
jquery中获取id值方法小结
Sep 22 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
Jun 11 Javascript
JavaScript AOP编程实例
Jun 16 Javascript
JS和JQuery实现雪花飘落效果
Nov 30 jQuery
在vue项目中安装使用Mint-UI的方法
Dec 27 Javascript
浅谈redux以及react-redux简单实现
Aug 28 Javascript
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
Sep 04 Javascript
手把手教你实现 Promise的使用方法
Sep 02 Javascript
ESLint 是如何检查 .vue 文件的
Nov 30 Vue.js
创建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常用hash加密函数
2014/11/22 PHP
php workerman定时任务的实现代码
2018/12/23 PHP
php把文件设置为插件的技巧方法
2020/02/03 PHP
Aster vs Newbee BO5 第二场2.19
2021/03/10 DOTA
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
一个可以增加和删除行的table并可编辑表格中内容
2014/06/16 Javascript
zepto中使用swipe.js制作轮播图附swipeUp,swipeDown不起效果问题
2015/08/27 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
2015/09/07 Javascript
WebPack基础知识详解
2017/01/16 Javascript
Bootstrap导航条学习使用(一)
2017/02/08 Javascript
使用get方式提交表单在地址栏里面不显示提交信息
2017/02/21 Javascript
微信小程序request请求后台接口php的实例详解
2017/09/20 Javascript
vue.js语法及常用指令
2017/10/29 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
javascript实现留言板功能
2020/02/08 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
解决新建一个vue项目过程中遇到的问题
2020/10/22 Javascript
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
python的id()函数介绍
2013/02/10 Python
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
2017/09/08 Python
Python用61行代码实现图片像素化的示例代码
2018/12/10 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
解决Python二维数组赋值问题
2019/11/28 Python
python 模拟登陆github的示例
2020/12/04 Python
名人珠宝设计师:Melinda Maria Jewelry
2019/03/06 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
linux面试题参考答案(7)
2012/10/29 面试题
介绍一下结构化程序设计方法和面向对象程序设计方法的区别
2012/06/27 面试题
电子商务专业在校生实习自我鉴定
2013/09/29 职场文书
护士自我鉴定
2013/10/23 职场文书
医学院学生求职简历的自我评价
2013/10/24 职场文书
自我推荐信范文
2014/05/09 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
pandas中DataFrame检测重复值的实现
2021/05/26 Python