微信小程序8种数据通信的方式小结
前言
数据通信在开发中是必不可少的一个环节,也是我们必须掌握的知识。知道得越多的数据通信方式,实现业务会更加得心应手。
下面我将这些通信方式归类介绍:
- 组件通信
- 全局通信
- 页面通信
组件通信
properties
父组件向子组件通信,与Vue的props作用相同。
父组件向子组件传数据:
子组件接收数据:
Component({
properties:{
list:{
type:Array,
value:[]
}
},
attached(){
console.log(this.list)
}
})
triggerEvent
子组件向父组件通信,与Vue的$emit作用相同
子组件触发自定义事件:
Component({
attached(){
this.triggerEvent('customEvent',{id:10})
}
})
父组件接收自定事件:
Page({
customEvent(e){
console.log(e.detail.id)
}
})
selectComponent
使用选择器选择组件实例节点,返回匹配到的第一个组件实例对象,类似Vue的ref
Page({
onLoad(){
letmycomponent=this.selectComponent('#mycomponent')
mycomponent.setData({
list:[]
})
}
})
selectOwnerComponent
选取当前组件节点所在的组件实例(即组件的引用者),返回它的组件实例对象,类似Vue的$parent
Component({
attached(){
letparent=this.selectOwnerComponent()
console.log(parent)
}
})
全局通信
globalData
将数据挂载到app.js,这种方式在开发中很常用。通过getApp(),我们能够在任何一个页面内访问到app实例。
app.js
App({
globalData:{
list:[]
}
})
page1.js
constapp=getApp()
Page({
onLoad(){
app.globalData.list.push({
id:10
})
}
})
page2.js
constapp=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
通过发布订阅模式注册事件和触发事件进行通信
简单实现
classEventBus{
constructor(){
this.task={}
}
on(name,cb){
if(!this.task[name]){
this.task[name]=[]
}
typeofcb==='function'&&this.task[name].push(cb)
}
emit(name,...arg){
lettaskQueen=this.task[name]
if(taskQueen&&taskQueen.length>0){
taskQueen.forEach(cb=>{
cb(...arg)
})
}
}
off(name,cb){
lettaskQueen=this.task[name]
if(taskQueen&&taskQueen.length>0){
letindex=taskQueen.indexOf(cb)
index!=-1&&taskQueen.splice(index,1)
}
}
once(name,cb){
functioncallback(...arg){
this.off(name,cb)
cb(...arg)
}
typeofcb==='function'&&this.on(name,callback)
}
}
exportdefaultEventBus
使用
app.js
importEventBusfrom'/util/EventBus'
wx.$bus=newEventBus()
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(){
letpages=getCurrentPages()
letlastPage=pages[pages.length-2]
lastPage.setData({
list:[]
})
}
})
写在最后
如果你还有其他的通信方式,欢迎交流~以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。