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


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 相关文章推荐
AJAX架构之Dojo篇
Apr 10 Javascript
jQuery之网页换肤实现代码
Apr 30 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
Sep 28 Javascript
javascript真的不难-回顾一下基础知识
Jan 15 Javascript
js实现人才网站职位选择功能的方法
Aug 14 Javascript
详解javascript实现自定义事件
Jan 19 Javascript
浅谈jquery点击label触发2次的问题
Jun 12 Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
Mar 10 Javascript
web前端vue filter 过滤器
Jan 12 Javascript
过滤器vue.filters的使用方法实现
Sep 18 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
Mar 07 Javascript
springboot+vue+对接支付宝接口+二维码扫描支付功能(沙箱环境)
Oct 15 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下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
php中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
js 绑定带参数的事件以及手动触发事件
2010/04/27 Javascript
JQuery Dialog的内存泄露问题解决方法
2010/06/18 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
在javascript中执行任意html代码的方法示例解读
2013/12/25 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
微信小程序 教程之WXML
2016/10/18 Javascript
vue.js实现表格合并示例代码
2016/11/30 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
详解AngularJS2 Http服务
2017/06/26 Javascript
详解.vue文件中style标签的几个标识符
2018/07/17 Javascript
js实现继承的方法及优缺点总结
2019/05/08 Javascript
利用JavaScript将Excel转换为JSON示例代码
2019/06/14 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
Vue记住滚动条和实现下拉加载的完美方法
2020/07/31 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
Python内置数据类型详解
2014/08/18 Python
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
python重试装饰器的简单实现方法
2019/01/31 Python
Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围
2019/06/25 Python
python 实现简单的FTP程序
2019/12/27 Python
医学院学生求职简历的自我评价
2013/10/24 职场文书
播音主持女孩的自我评价分享
2013/11/20 职场文书
工商管理专业职业生涯规划
2014/01/01 职场文书
企业安全生产承诺书
2014/05/22 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
创业计划书之网络外卖
2019/10/31 职场文书
Python装饰器的练习题
2021/11/23 Python
CSS 实现角标效果的完整代码
2022/06/28 HTML / CSS