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


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 相关文章推荐
javascript 动态数据下的锚点错位问题解决方法
Dec 24 Javascript
js的逻辑运算符 ||
May 31 Javascript
javascript表单验证和Window详解
Dec 11 Javascript
jQuery选择器之基本选择器与层次选择器
Mar 03 Javascript
jquery使用animate方法实现控制元素移动
Mar 27 Javascript
JavaScript中连接操作Oracle数据库实例
Apr 02 Javascript
jquery获取所有选中的checkbox实现代码
May 26 Javascript
JavaScript Promise 用法
Jun 14 Javascript
AngularJS表格样式简单设置方法示例
Mar 03 Javascript
jQuery实现按比例缩放图片的方法
Apr 29 jQuery
vue多层嵌套路由实例分析
Mar 19 Javascript
vue配置nprogress实现页面顶部进度条
Sep 21 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
ip签名探针
2006/10/09 PHP
PHP PDOStatement::bindColumn讲解
2019/01/30 PHP
php中isset与empty函数的困惑与用法分析
2019/07/05 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
在JavaScript中处理数组之reverse()方法的使用
2015/06/09 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
基于jQuery实现Tabs选项卡自定义插件
2016/11/21 Javascript
ES6中的箭头函数实例详解
2017/04/06 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
微信小程序实现跳转的几种方式总结(推荐)
2019/04/24 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
通过图带你深入了解vue的响应式原理
2019/06/21 Javascript
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
[49:18]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 OG vs TNC
2018/04/01 DOTA
[44:43]完美世界DOTA2联赛决赛日 FTD vs GXR 第一场 11.08
2020/11/11 DOTA
[46:44]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第二场 3月7日
2021/03/11 DOTA
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
Python挑选文件夹里宽大于300图片的方法
2015/03/05 Python
python使用KNN算法手写体识别
2018/02/01 Python
Pycharm设置去除显示的波浪线方法
2018/10/28 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
python格式化输出保留2位小数的实现方法
2019/07/02 Python
详解如何减少python内存的消耗
2019/08/09 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
详解HTML5中的标签
2015/06/19 HTML / CSS
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
html5视频自动横过来自适应页面且点击播放功能的实现
2020/06/03 HTML / CSS
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
冬季施工防火方案
2014/05/17 职场文书
教学质量月活动总结
2015/05/11 职场文书
致接力运动员加油稿
2015/07/21 职场文书
vue中data里面的数据相互使用方式
2022/06/05 Vue.js