微信小程序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 相关文章推荐
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
Aug 14 Javascript
jquery ui对话框实例代码
May 10 Javascript
node.js实现多图片上传实例
Jun 03 Javascript
封装好的一个万能检测表单的方法
Jan 21 Javascript
javascript动态创建链接的方法
May 13 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
Oct 27 Javascript
Jquery操作cookie记住用户名
Mar 29 Javascript
javascript 中的事件委托详解
Oct 25 Javascript
JS实现的base64加密解密操作示例
Apr 18 Javascript
详解在Vue中使用TypeScript的一些思考(实践)
Jul 06 Javascript
其实你可以少写点if else与switch(推荐)
Jan 10 Javascript
Vue切换Tab动态渲染组件的操作
Sep 21 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 进度条实现代码
2009/03/10 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
event对象的方法 兼容多浏览器
2009/06/27 Javascript
jQuery初学:find()方法及children方法的区别分析
2011/01/31 Javascript
js style动态设置table高度
2014/10/21 Javascript
jQuery判断是否存在滚动条的简单方法
2016/09/17 Javascript
jQuery表单元素选择器代码实例
2017/02/06 Javascript
原生js和css实现图片轮播效果
2017/02/07 Javascript
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
Vue 实现简易多行滚动&quot;弹幕&quot;效果
2020/01/02 Javascript
Vue+element+cookie记住密码功能的简单实现方法
2020/09/20 Javascript
python网络爬虫采集联想词示例
2014/02/11 Python
Python3中的真除和Floor除法用法分析
2016/03/16 Python
python递归查询菜单并转换成json实例
2017/03/27 Python
详解django中自定义标签和过滤器
2017/07/03 Python
numpy.delete删除一列或多列的方法
2018/04/03 Python
Flask Web开发入门之文件上传(八)
2018/08/17 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
2019/04/11 Python
Django发送邮件和itsdangerous模块的配合使用解析
2019/08/10 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
python 判断一组数据是否符合正态分布
2020/09/23 Python
IE9下html5初试小刀
2010/09/21 HTML / CSS
美国第一个网上卖鞋零售商:OnlineShoes.com
2017/09/24 全球购物
匈牙利最大的健身制造商和销售商:inSPORTline
2018/10/30 全球购物
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
我的小天地教学反思
2014/04/30 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
乡镇领导干部个人对照检查材料思想汇报
2014/09/23 职场文书
物业保洁员岗位职责
2015/02/13 职场文书
社区义诊通知
2015/04/24 职场文书
儿子满月酒致辞
2015/07/29 职场文书
mysql部分操作
2021/04/05 MySQL