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


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 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
Apr 07 Javascript
ie focus bug 解决方法
Sep 03 Javascript
使用jQuery轻松实现Ajax的实例代码
Aug 16 Javascript
基于jQuery的模仿新浪微博时间的组件
Oct 04 Javascript
js中根据字数截取字符串,不能截断url
Jan 12 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
Jan 15 Javascript
javascript实现禁止右键和F12查看源代码
Dec 26 Javascript
javascript实现在线客服效果
Jul 15 Javascript
underscore之Chaining_动力节点Java学院整理
Jul 10 Javascript
vue-cli+webpack项目 修改项目名称的方法
Feb 28 Javascript
小程序文字跑马灯效果
Dec 28 Javascript
js实现图片跟随鼠标移动效果
Oct 16 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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
利用phpExcel实现Excel数据的导入导出(全步骤详细解析)
2013/11/26 PHP
php的ddos攻击解决方法
2015/01/08 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
yii使用activeFileField控件实现上传文件与图片的方法
2015/12/28 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
2013/01/25 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
2013/10/18 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
2017/05/08 Javascript
jQuery日期范围选择器附源码下载
2017/05/23 jQuery
微信小程序实现用table显示数据库反馈的多条数据功能示例
2019/05/07 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
Python递归遍历列表及输出的实现方法
2015/05/19 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
Python 实用技巧之利用Shell通配符做字符串匹配
2019/08/23 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
Python3.7安装keras和TensorFlow的教程图解
2020/06/18 Python
python实现按首字母分类查找功能
2019/10/31 Python
python爬取招聘要求等信息实例
2020/11/20 Python
全球虚拟主机商:HostGator
2017/02/06 全球购物
JustFab加拿大:女鞋、靴子、手袋和服装在线
2018/05/18 全球购物
全球性的在线商店:Vogca
2019/05/10 全球购物
将"引用"作为函数返回值类型的格式、好处和需要遵守的规则
2016/02/09 面试题
问卷调查计划书
2014/01/10 职场文书
幼儿园大班毕业感言
2014/02/06 职场文书
文明礼仪标语
2014/06/13 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
四年级数学上册教学计划
2015/01/20 职场文书
求职信范文怎么写
2015/03/19 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers