微信小程序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 相关文章推荐
IE DOM实现存在的部分问题及解决方法
Jul 25 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
Jan 01 Javascript
javascript面向对象编程(一) 实例代码
Jun 25 Javascript
判断多个input type=file是否有已经选择好文件的代码
May 23 Javascript
一个实用的图片切换支持点击切换和自动轮播
Sep 09 Javascript
javascript委托(Delegate)blur和focus用法实例分析
May 26 Javascript
JavaScript正则表达式中的ignoreCase属性使用详解
Jun 16 Javascript
jQuery插件Timelinr 实现时间轴特效
Oct 04 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
Feb 08 Javascript
js仿淘宝商品放大预览功能
Mar 15 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
Jul 25 Javascript
Vue中util的工具函数实例详解
Jul 08 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中数组的分组排序实例
2014/06/01 PHP
PHP fclose函数用法总结
2019/02/15 PHP
ExtJS下grid的一些属性说明
2009/12/13 Javascript
判断文件是否正在被使用的JS代码
2013/12/21 Javascript
js中window.open()的所有参数详细解析
2014/01/09 Javascript
如何让浏览器支持jquery ajax load 前进、后退功能
2014/06/12 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
js常用DOM方法详解
2017/02/04 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
详解AngularJs HTTP响应拦截器实现登陆、权限校验
2017/04/11 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
[05:05]第三天的dota2
2013/07/29 DOTA
Python实现的矩阵类实例
2017/08/22 Python
在Python 不同级目录之间模块的调用方法
2019/01/19 Python
python实现五子棋人机对战游戏
2020/03/25 Python
使用Python实现跳一跳自动跳跃功能
2019/07/10 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
python for循环remove同一个list过程解析
2019/08/14 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
python GUI库图形界面开发之PyQt5复选框控件QCheckBox详细使用方法与实例
2020/02/28 Python
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
应届毕业生通用的自荐书范文
2014/02/07 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
社会工作专业自荐信
2014/09/26 职场文书
全陪导游词开场白
2015/05/29 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
趣味运动会标语口号
2015/12/26 职场文书
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL