微信小程序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 事件冒泡的介绍以及如何阻止事件冒泡
Dec 25 Javascript
javascript 日期时间 转换的方法
Feb 21 Javascript
jquery获取html元素的绝对位置和相对位置的方法
Jun 20 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
Jan 12 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
Aug 31 Javascript
实例详解display:none与visible:hidden的区别
Mar 30 Javascript
javaScript和jQuery自动加载简单代码实现方法
Nov 24 jQuery
Vuepress 搭建带评论功能的静态博客的实现
Feb 17 Javascript
jQuery实现的隔行变色功能【案例】
Feb 18 jQuery
微信小程序左滑删除实现代码实例
Sep 16 Javascript
Element-UI 使用el-row 分栏布局的教程
Oct 26 Javascript
Vue 数据响应式相关总结
Jan 28 Vue.js
使用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中数据的批量导入(csv文件)
2006/10/09 PHP
ThinkPHP权限认证Auth实例详解
2014/07/22 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
js文件包含的几种方式介绍
2014/09/28 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
node.js 用socket实现聊天的示例代码
2017/10/17 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
Laravel整合Bootstrap 4的完整方案(推荐)
2018/01/25 Javascript
bootstrap中日历范围选择插件daterangepicker的使用详解
2018/04/17 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
基于vue实现一个禅道主页拖拽效果
2019/05/27 Javascript
用python实现批量重命名文件的代码
2012/05/25 Python
python实现中文转换url编码的方法
2016/06/14 Python
Python入门之后再看点什么好?
2018/03/05 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
沙特阿拉伯网上购物:Sayidaty Mall
2018/05/06 全球购物
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
英国领先的隐形眼镜在线供应商:Lenstore.co.uk
2019/11/24 全球购物
英文简历中的自我评价
2013/10/06 职场文书
搞笑获奖感言
2014/01/30 职场文书
网络工程师专家职业发展路线
2014/02/14 职场文书
建议书的格式
2014/05/12 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
小学生优秀评语
2014/12/29 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
财务人员入职担保书
2015/09/22 职场文书
大学军训心得体会800字
2016/01/11 职场文书
Win11怎么修改电源模式?Win11修改电源模式的方法
2022/04/05 数码科技