微信小程序跨页面数据传递事件响应实现过程解析


Posted in Javascript onDecember 19, 2019

这篇文章主要介绍了微信小程序跨页面数据传递事件响应实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在实际工作中有很多场景需要在第二个页面中将用户操作之后的将数据回传到上一页面。接下来将我的方案分享给小伙伴。 本次示例采用 uni-app 框架和 weui 样式库 实现思路 创建一个 Emitter,用于事件处理 创建一个 ...

在实际工作中有很多场景需要在第二个页面中将用户操作之后的将数据回传到上一页面。接下来将我的方案分享给小伙伴。

本次示例采用 uni-app 框架和 weui 样式库

实现思路

  • 创建一个 Emitter,用于事件处理
  • 创建一个全局的 Storage
  • 在第一个页面创建一个 emitter 对象,并添加事件监听,将 emitter 存储到 Storage 中
  • 在第二个页面从 Storage 中取出 emitter 对象, 并触发事件,将数据传递到第一个页面中做处理

创建 Emitter

function isFunc(fn) {
 return typeof fn === 'function';
}

export default class Emitter {
 constructor() {
 this._store = {};
 }

 /**
 * 事件监听
 * @param {String} event 事件名
 * @param {Function} listener 事件回调函数
 */
 on(event, listener) {
 const listeners = this._store[event] || (this._store[event] = []);

 listeners.push(listener);
 }

 /**
 * 取消事件监听
 * @param {String} event 事件名
 * @param {Function} listener 事件回调函数
 */
 off(event, listener) {
 const listeners = this._store[event] || (this._store[event] = []);

 listeners.splice(listeners.findIndex(item => item === listener), 1);
 }

 /**
 * 事件监听 仅监听一次
 * @param {String} event 事件名
 * @param {Function} listener 事件回调函数
 */
 once(event, listener) {
 const proxyListener = (data) => {
  isFunc(listener) && listener.call(null, data);

  this.off(event, proxyListener);
 }

 this.on(event, proxyListener);
 }

 /**
 * 触发事件
 * @param {String} 事件名
 * @param {Object} 传给事件回调函数的参数
 */
 emit(event, data) {
 const listeners = this._store[event] || (this._store[event] = []);

 for (const listener of listeners) {
  isFunc(listener) && listener.call(null, data);
 }
 }
}

创建 Storage

export class Storage {
 constructor() {
 this._store = {};
 }

 add(key, val) {
 this._store[key] = val;
 }
 
 get(key) {
 return this._store[key];
 }
 
 remove(key) {
 delete this._store[key];
 }
 
 clear() {
 this._store = {};
 }
}

export default new Storage();

第一个页面中的处理

<template>
 <div class="page">
 <div class="weui-cells__title">选择城市</div>
 <div class="weui-cells weui-cells_after-title">
  <navigator :url="`../select/select?id=${cityId}`" class="weui-cell weui-cell_access" hover-class="weui-cell_active">
  <div class="weui-cell__hd weui-label">所在城市</div>
  <div class="weui-cell__bd" :style="{color: cityName || '#999'}">{{ cityName || '请选择' }}</div>
  <div class="weui-cell__ft weui-cell__ft_in-access"></div>
  </navigator>
 </div>
 </div>
</template>

<script>
import Emitter from '../../utils/emitter';
import storage from '../../utils/storage';

export default {
 data() {
 return {
  cityId: '',
  cityName: '',
 }
 },
 onLoad() {
 const emitter = new Emitter();

 // 将emitter存到storage中
 storage.add('indexEmitter', emitter);

 // 添加事件监听
 emitter.on('onSelect', this.handleSelect);
 },
 methods: {
 // 事件处理
 handleSelect(data) {
  this.cityId = data.id;
  this.cityName = data.text;
 }
 }
}
</script>

第二个页面中的处理

<template>
 <div class="page">
 <div class="weui-cells__title">城市列表</div>
 <div class="weui-cells weui-cells_after-title">
  <radio-group @change="handleChange">
  <label class="weui-cell weui-check__label" v-for="item in list" :key="item.id">
   <radio class="weui-check" :value="item.id" :checked="`${item.id}` === selectedId" />
   <div class="weui-cell__bd">{{ item.text }}</div>
   <div v-if="`${item.id}` === selectedId" class="weui-cell__ft weui-cell__ft_in-radio">
   <icon class="weui-icon-radio" type="success_no_circle" size="16" />
   </div>
  </label>
  </radio-group>
 </div>
 </div>
</template>

<script>
import storage from '../../utils/storage';

export default {
 data() {
 return {
  list: [
  { id: 0, text: '北京' },
  { id: 1, text: '上海' },
  { id: 2, text: '广州' },
  { id: 3, text: '深圳' },
  { id: 4, text: '杭州' },
  ],
  selectedId: ''
 }
 },
 onLoad({ id }) {
 this.selectedId = id;
 
 // 取出 emitter
 this.emitter = storage.get('indexEmitter');
 },
 methods: {
 handleChange(e) {
  this.selectedId = e.detail.value;

  const item = this.list.find(({ id }) => `${id}` === e.detail.value);

  // 触发事件并传递数据
  this.emitter.emit('onSelect', { ...item });
 }
 }
}
</script>

传送门

github

总结

之所以将Storage定义成全局的,是为了保证第一个页面放到Storage中和第二个页面从 Storage 中取出的emitter是同一个实例,如此第一个页面才能正确监听到第二个页面触发的事件。也可以使用 vuex,将 emitter 放到 state 中。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js 对小数加法精度处理示例说明
Dec 27 Javascript
JavaScript 作用域链解析
Nov 13 Javascript
Jquery实现弹性滑块滑动选择数值插件
Aug 08 Javascript
jQuery实现联动下拉列表查询框
Jan 04 Javascript
hammer.js实现图片手势放大效果
Aug 29 Javascript
bootstrap日期插件daterangepicker使用详解
Oct 19 Javascript
react-router browserHistory刷新页面404问题解决方法
Dec 29 Javascript
jquery实现楼层滚动效果
Jan 01 jQuery
Vue-cli3.X使用px2 rem遇到的问题及解决方法
Aug 08 Javascript
在vue中使用防抖函数组件操作
Jul 26 Javascript
javascript中正则表达式语法详解
Aug 07 Javascript
Vue Element plus使用方法梳理
Dec 24 Vue.js
js通过循环多张图片实现动画效果
Dec 19 #Javascript
JS实现水平移动与垂直移动动画
Dec 19 #Javascript
5分钟快速看懂ES6中的反射与代理
Dec 19 #Javascript
d3.js实现图形拖拽
Dec 19 #Javascript
d3.js实现图形缩放平移
Dec 19 #Javascript
微信小程序批量上传图片到七牛(推荐)
Dec 19 #Javascript
echarts实现折线图的拖拽效果
Dec 19 #Javascript
You might like
收音机发烧友应当熟知的100条知识
2021/03/02 无线电
PHP中的reflection反射机制测试例子
2014/08/05 PHP
php+mysql实现数据库随机重排实例
2014/10/17 PHP
如何解决PHP获取不到SESSION信息之一般情况
2019/10/10 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
详谈jQuery中的this和$(this)
2014/11/13 Javascript
javascript判断数组内是否重复的方法
2015/04/21 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
Javascript编写俄罗斯方块思路及实例
2015/07/07 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
2016/10/19 Javascript
jquery 删除节点 添加节点 找兄弟节点的简单实现
2016/12/07 Javascript
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
2018/01/17 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
python超简单解决约瑟夫环问题
2015/05/12 Python
python脚本内运行linux命令的方法
2015/07/02 Python
Python中对象的引用与复制代码示例
2017/12/04 Python
Python内置模块logging用法实例分析
2018/02/12 Python
Python 字符串与数字输出方法
2018/07/16 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
Python3将jpg转为pdf文件的方法示例
2019/12/13 Python
np.dot()函数的用法详解
2020/01/17 Python
python实现MySQL指定表增量同步数据到clickhouse的脚本
2021/02/26 Python
购买美国制造的相框和画框架:Picture Frames
2018/08/14 全球购物
理肤泉英国官网:La Roche-Posay英国
2019/01/14 全球购物
银行优秀员工事迹
2014/02/06 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
养牛场项目建议书
2014/05/13 职场文书
公司离职证明范本
2014/10/17 职场文书
2015年中学总务处工作总结
2015/07/22 职场文书
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python
python 进阶学习之python装饰器小结
2021/09/04 Python