微信小程序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 相关文章推荐
javascript 设计模式之单体模式 面向对象学习基础
Apr 18 Javascript
Javascript中的匿名函数与封装介绍
Mar 15 Javascript
基于jQuery实现的扇形定时器附源码下载
Oct 20 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
Mar 07 Javascript
JS中正则表达式只有3种匹配模式(没有单行模式)详解
Jul 28 Javascript
js简单时间比较的方法
Aug 02 Javascript
jQuery Easyui快速入门教程
Aug 21 Javascript
jQuery布局组件EasyUI Layout使用方法详解
Feb 28 Javascript
node实现基于token的身份验证
Apr 09 Javascript
JavaScript封闭函数及常用内置对象示例
May 13 Javascript
在vue-cli 3中给stylus、sass样式传入共享的全局变量
Aug 12 Javascript
JavaScript工具库MyTools详解
Jan 01 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/25 PHP
PHP 加密与解密的斗争
2009/04/17 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
什么是JavaScript
2009/08/13 Javascript
使用jquery实现简单的ajax
2013/07/08 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
深入理解javascript的getTime()方法
2017/02/16 Javascript
浅谈vue首屏加载优化
2018/06/28 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
2019/01/31 Javascript
微信小程序云开发实现增删改查功能
2019/05/17 Javascript
nodejs log4js 使用详解
2019/05/31 NodeJs
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
跟老齐学Python之从if开始语句的征程
2014/09/14 Python
九步学会Python装饰器
2015/05/09 Python
使用Python导出Excel图表以及导出为图片的方法
2015/11/07 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
python实现感知器
2017/12/19 Python
Python中一些不为人知的基础技巧总结
2018/05/19 Python
Python实现的knn算法示例
2018/06/14 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
Python爬虫——爬取豆瓣电影Top250代码实例
2019/04/17 Python
python颜色随机生成器的实例代码
2020/01/10 Python
Eclipse配置python默认头过程图解
2020/04/26 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
HTML5拖放API实现拖放排序的实例代码
2017/05/11 HTML / CSS
关于HTML5+ API plusready的兼容问题
2020/11/20 HTML / CSS
英国厨房与餐具用品为主的设计品牌:Joseph Joseph
2018/04/26 全球购物
高校学生干部的自我评价分享
2013/11/04 职场文书
安全生产网格化管理实施方案
2014/03/01 职场文书
《陈毅探母》教学反思
2014/05/01 职场文书
婚内房产协议书范本
2014/10/02 职场文书
庭外和解协议书
2016/03/23 职场文书
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js