微信小程序8种数据通信的方式小结


Posted in Javascript onFebruary 03, 2020

前言

数据通信在开发中是必不可少的一个环节,也是我们必须掌握的知识。知道得越多的数据通信方式,实现业务会更加得心应手。

下面我将这些通信方式归类介绍:

  • 组件通信
  • 全局通信
  • 页面通信

组件通信

properties

父组件向子组件通信,与 Vue 的 props 作用相同。

父组件向子组件传数据:

<my-component list="{{list}}"></my-component>

子组件接收数据:

Component({
 properties:{
  list:{
   type: Array,
   value: []
  }
 },
 attached(){
  console.log(this.list)
 }
})

triggerEvent

子组件向父组件通信,与 Vue 的 $emit 作用相同
子组件触发自定义事件:

Component({
 attached(){
  this.triggerEvent('customEvent',{ id: 10 })
 }
})

父组件接收自定事件:

<my-component list="{{list}}" bind:customEvent="customEvent"></my-component>
Page({
 customEvent(e){
  console.log(e.detail.id)
 }
})

selectComponent

使用选择器选择组件实例节点,返回匹配到的第一个组件实例对象,类似 Vue 的 ref

<my-component id="mycomponent" list="{{list}}"></my-component>
Page({
 onLoad(){
  let mycomponent = this.selectComponent('#mycomponent')
  mycomponent.setData({
   list: []
  })
 }
})

selectOwnerComponent

选取当前组件节点所在的组件实例(即组件的引用者),返回它的组件实例对象,类似 Vue 的 $parent

Component({
 attached(){
  let parent = this.selectOwnerComponent()
  console.log(parent)
 }
})

全局通信

globalData

将数据挂载到 app.js,这种方式在开发中很常用。通过getApp(),我们能够在任何一个页面内访问到app实例。
app.js

App({
 globalData:{
  list:[]
 }
})

page1.js

const app = getApp()
Page({
 onLoad(){
  app.globalData.list.push({
   id: 10
  })
 }
})

page2.js

const app = getApp()
Page({
 onLoad(){
  console.log(app.globalData.list) // [{id:10}]
 }
})

storage

storage并不是作为通信的主要方式。storage 主要是为了缓存数据,并且最多只能存储10M的数据,我们应该合理使用storage

wx.setStorageSync('timestamp', Date.now())
wx.getStorageSync('timestamp')
wx.removeStorageSync('timestamp')

eventBus

通过发布订阅模式注册事件和触发事件进行通信

简单实现

class EventBus{
 constructor(){
  this.task = {}
 }

 on(name, cb){
  if(!this.task[name]){
   this.task[name] = []
  }
  typeof cb === 'function' && this.task[name].push(cb)
 }

 emit(name, ...arg){
  let taskQueen = this.task[name]
  if(taskQueen && taskQueen.length > 0){
   taskQueen.forEach(cb=>{
    cb(...arg)
   })
  }
 }

 off(name, cb){
  let taskQueen = this.task[name]
  if(taskQueen && taskQueen.length > 0){
   let index = taskQueen.indexOf(cb)
   index != -1 && taskQueen.splice(index, 1)
  }
 }

 once(name, cb){
  function callback(...arg){
   this.off(name, cb)
   cb(...arg)
  }
  typeof cb === 'function' && this.on(name, callback)
 }
}

export default EventBus

使用

app.js

import EventBus from '/util/EventBus'

wx.$bus = new EventBus()
page1.js
Page({
 onLoad(){
  wx.$bus.on('add', this.addHandler)
 },
 addHandler(a, b){
  console.log(a+b)
 }
})

page2.js

Page({
 onLoad(){
  wx.$bus.emit('add', 10, 20)
 },
})

页面通信

getCurrentPages

getCurrentPages() 获取当前页面栈,数组中第一个元素为首页,最后一个元素为当前页面
元素为一个对象,里面存放着页面的信息,包括route(页面路径)、options(onLoad拿到的参数)、method、data等

Page({
 onLoad(){
  let pages = getCurrentPages()
  let lastPage = pages[pages.length-2]
  lastPage.setData({
   list: []
  })
 }
})

写在最后

如果你还有其他的通信方式,欢迎交流~以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Jquery 实现Tab效果 思路是js思路
Mar 02 Javascript
再谈javascript面向对象编程
Mar 18 Javascript
JavaScript实现的类字典插入或更新方法实例
Jul 10 Javascript
JS模拟酷狗音乐播放器收缩折叠关闭效果代码
Oct 29 Javascript
第九章之路径分页标签与徽章组件
Apr 25 Javascript
EasyUI修改DateBox和DateTimeBox的默认日期格式示例
Jan 18 Javascript
JavaScript 基础表单验证示例(纯Js实现)
Jul 20 Javascript
详解使用webpack构建多页面应用
Dec 21 Javascript
JS生成随机打乱数组的方法示例
Dec 23 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
Jan 27 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
Nov 20 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
Nov 29 Javascript
使用js实现单链解决前端队列问题的方法
Feb 03 #Javascript
javscript 数组扁平化的实现
Feb 03 #Javascript
Vue强制组件重新渲染的方法讨论
Feb 03 #Javascript
JavaScript中的类型检查
Feb 03 #Javascript
Vue的Eslint配置文件eslintrc.js说明与规则介绍
Feb 03 #Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
Feb 03 #Javascript
24个解决实际问题的ES6代码片段(小结)
Feb 02 #Javascript
You might like
PHP编程中八种常见的文件操作方式
2006/11/19 PHP
php循环语句 for()与foreach()用法区别介绍
2012/09/05 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
php 使用redis锁限制并发访问类示例
2016/11/02 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
JavaScript实现自动弹出窗口并自动关闭窗口的方法
2015/08/06 Javascript
JavaScript实现的背景自动变色代码
2015/10/17 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
angularjs实现猜数字大小功能
2020/05/20 Javascript
Cordova(ionic)项目实现双击返回键退出应用
2019/09/17 Javascript
vue.js 实现a标签href里添加参数
2019/11/12 Javascript
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
Python2.x版本中基本的中文编码问题解决
2015/10/12 Python
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
python 批量修改/替换数据的实例
2018/07/25 Python
python 图像平移和旋转的实例
2019/01/10 Python
python实现图片转字符小工具
2019/04/30 Python
Python 元组操作总结
2019/09/18 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
python连接mysql有哪些方法
2020/06/24 Python
Groupon西班牙官方网站:在线优惠券和交易,节省高达70%
2021/03/13 全球购物
杭州信雅达系统.NET工程师面试试题
2015/02/08 面试题
个人自我鉴定怎么写
2013/10/28 职场文书
教师专业理论水平的自我评价分享
2013/11/09 职场文书
拾金不昧表扬信范文
2014/01/11 职场文书
初三物理教学反思
2014/01/21 职场文书
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
弘扬职业精神演讲稿
2014/03/20 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
欢迎标语大全
2014/06/21 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
python 使用tkinter与messagebox写界面和弹窗
2022/03/20 Python