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


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 相关文章推荐
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
Aug 06 Javascript
js使下拉列表框可编辑不止是选择
Dec 12 Javascript
带左右箭头图片轮播的JS代码
Dec 18 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
Dec 17 Javascript
jQuery实现图片文字淡入淡出效果
Dec 21 Javascript
jquery实现一个简单的表单验证实例
Mar 30 Javascript
javascript基础练习之翻转字符串与回文
Feb 20 Javascript
原生JS实现动态加载js文件并在加载成功后执行回调函数的方法
Dec 30 Javascript
angularJS1 url中携带参数的获取方法
Oct 09 Javascript
JS实现的A*寻路算法详解
Dec 14 Javascript
基于javascript实现贪吃蛇小游戏
Nov 25 Javascript
Vue路由切换页面不更新问题解决方案
Jul 10 Javascript
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
深入PHP与浏览器缓存的分析
2013/06/03 PHP
JavaScript 学习笔记(十三)Dom创建表格
2010/01/21 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
今天是星期几的4种JS代码写法
2013/09/17 Javascript
容易造成JavaScript内存泄露几个方面
2014/09/04 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
使用js实现的简单拖拽效果
2015/03/18 Javascript
JavaScript函数使用的基本教程
2015/06/04 Javascript
js图片翻书效果代码分享
2015/08/20 Javascript
jQuery实现复制到粘贴板功能
2017/02/11 Javascript
nginx配置React静态页面的方法教程
2017/11/03 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
Vue组件实现触底判断
2019/06/26 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
JavaScript cookie原理及使用实例
2020/05/08 Javascript
vue-router 2.0 跳转之router.push()用法说明
2020/08/12 Javascript
tornado框架blog模块分析与使用
2013/11/21 Python
详解Python中break语句的用法
2015/05/14 Python
Django Rest framework频率原理与限制
2019/07/26 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
python 一维二维插值实例
2020/04/22 Python
Python while true实现爬虫定时任务
2020/06/08 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
详解Python中的Lock和Rlock
2021/01/26 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
速比涛英国官网:Speedo英国
2019/07/15 全球购物
运动会广播稿80字
2014/01/23 职场文书
咖啡店创业计划书
2014/08/15 职场文书
作风整顿剖析材料
2014/09/30 职场文书
社区六一儿童节活动总结
2015/02/11 职场文书
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL