微信小程序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 相关文章推荐
js变形金刚文字特效代码分享
Aug 20 Javascript
Javascript vue.js表格分页,ajax异步加载数据
Oct 24 Javascript
CSS+jQuery实现简单的折叠菜单
Dec 20 Javascript
EsLint入门学习教程
Feb 17 Javascript
jQuery遍历节点方法汇总(推荐)
May 13 jQuery
ionic3 懒加载
Aug 16 Javascript
AngularJS 表单验证手机号的实例(非必填)
Nov 12 Javascript
React Native 使用Fetch发送网络请求的示例代码
Dec 02 Javascript
vue 指定组件缓存实例详解
Apr 01 Javascript
小程序实现留言板
Nov 02 Javascript
vue实现手机端省市区区域选择
Sep 27 Javascript
js实现提交前对列表数据的增删改查
Jan 16 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轻量级数据库操作类Medoo增加、删除、修改、查询例子
2014/07/04 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
CI框架AR数据库操作常用函数总结
2016/11/21 PHP
javascript格式化指定日期对象的方法
2015/04/21 Javascript
浅析JS运动
2015/12/28 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
js实现微博发布小功能
2017/01/12 Javascript
Vue中fragment.js使用方法详解
2017/03/09 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
基于Vue实现支持按周切换的日历
2020/09/24 Javascript
vue项目优化之通过keep-alive数据缓存的方法
2017/12/11 Javascript
详解vue-cli 接口代理配置
2017/12/13 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
JavaScript canvas实现跟随鼠标移动小球
2021/02/09 Javascript
Python的垃圾回收机制深入分析
2014/07/16 Python
python和bash统计CPU利用率的方法
2015/07/10 Python
Centos Python2 升级到Python3的简单实现
2016/06/21 Python
python中利用队列asyncio.Queue进行通讯详解
2017/09/10 Python
Django 多语言教程的实现(i18n)
2018/07/07 Python
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
专业实习自我鉴定
2013/10/29 职场文书
高校优秀辅导员事迹材料
2014/05/07 职场文书
合伙购房协议样本
2014/10/06 职场文书
2014年节能工作总结
2014/12/18 职场文书
会议营销主持词
2015/07/03 职场文书
KTV员工管理制度
2015/08/06 职场文书
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS
Nginx配置之实现多台服务器负载均衡
2021/08/02 Servers
MySQL的意向共享锁、意向排它锁和死锁
2022/07/15 MySQL