微信小程序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选择器简明总结(含用法实例,一目了然)
Apr 25 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
Jun 03 Javascript
简单介绍JavaScript数据类型之隐式类型转换
Dec 28 Javascript
jQuery post数据至ashx实例详解
Nov 18 Javascript
Javascript设计模式之装饰者模式详解篇
Jan 17 Javascript
ztree实现权限横向显示功能
May 20 Javascript
webpack构建react多页面应用详解
Sep 15 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
Mar 16 Javascript
Vue 项目分环境打包的方法示例
Aug 03 Javascript
Vue通过ref父子组件拿值方法
Sep 12 Javascript
浅谈vux之x-input使用以及源码解读
Nov 04 Javascript
用Vue编写抽象组件的方法
May 06 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/07/30 PHP
ThinkPHP模板引擎之导入资源文件方法详解
2014/06/18 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
PHP常用日期加减计算方法实例小结
2018/07/31 PHP
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
javascript中不等于的代码是什么怎么写
2013/12/29 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
Javascript动态创建表格及删除行列的方法
2015/05/15 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
JS动态的把左边列表添加到右边的实现代码(可上下移动)
2016/11/17 Javascript
详解微信小程序中的页面代码中的模板的封装
2017/10/12 Javascript
Vue的事件响应式进度条组件实例详解
2018/02/04 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
基于js Canvas实现二次贝塞尔曲线
2018/12/25 Javascript
node全局变量__dirname与__filename的区别
2019/01/14 Javascript
vue实践---根据不同环境,自动转换请求的url地址操作
2020/09/21 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
在Python的gevent框架下执行异步的Solr查询的教程
2015/04/16 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
浅谈django 模型类使用save()方法的好处与注意事项
2020/03/28 Python
对python中list的五种查找方法说明
2020/07/13 Python
Python如何测试stdout输出
2020/08/10 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
详解使用postMessage解决iframe跨域通信问题
2019/11/01 HTML / CSS
Gap英国官网:Gap UK
2018/07/18 全球购物
linux面试题参考答案(3)
2012/09/13 面试题
Linux Interview Questions For software testers
2012/06/02 面试题
党日活动总结
2014/05/07 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
k8s部署redis cluster集群的实现
2021/06/24 Redis
CSS中float高度塌陷问题的四种解决方案
2022/04/18 HTML / CSS