微信小程序8種數據通信的方式總結

下面我將這些通信方式歸類介紹:

  • 組件通信
  • 全局通信
  • 頁面通信

 一、組件通信

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: []
    })
  }
})

如果你還有其他的通信方式,歡迎交流~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章