前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信小程序8种数据通信的方式

微信小程序8种数据通信的方式

作者头像
WahFung
发布2020-08-24 15:14:43
9950
发布2020-08-24 15:14:43
举报
文章被收录于专栏:前端技术分享前端技术分享

前言

数据通信在开发中是必不可少的一个环节,也是我们必须掌握的知识。知道得越多的数据通信方式,实现业务会更加得心应手。

下面我将这些通信方式归类介绍:

  • 组件通信
  • 全局通信
  • 页面通信

组件通信

properties

父组件向子组件通信,与 Vue 的 props 作用相同。

父组件向子组件传数据:

代码语言:javascript
复制
<my-component list="{{list}}"></my-component>

子组件接收数据:

代码语言:javascript
复制
Component({
  properties:{
    list:{
      type: Array,
      value: []
    }
  },
  attached(){
    console.log(this.list)
  }
})

triggerEvent

子组件向父组件通信,与 Vue 的 $emit 作用相同

子组件触发自定义事件:

代码语言:javascript
复制
Component({
  attached(){
    this.triggerEvent('customEvent',{ id: 10 })
  }
})

父组件接收自定事件:

代码语言:javascript
复制
<my-component list="{{list}}" bind:customEvent="customEvent"></my-component>
代码语言:javascript
复制
Page({
  customEvent(e){
    console.log(e.detail.id)
  }
})

selectComponent

使用选择器选择组件实例节点,返回匹配到的第一个组件实例对象,类似 Vue 的 ref

代码语言:javascript
复制
<my-component id="mycomponent" list="{{list}}"></my-component>
代码语言:javascript
复制
Page({
  onLoad(){
    let mycomponent = this.selectComponent('#mycomponent')
    mycomponent.setData({
      list: []
    })
  }
})

selectOwnerComponent

选取当前组件节点所在的组件实例(即组件的引用者),返回它的组件实例对象,类似 Vue 的 $parent

代码语言:javascript
复制
Component({
  attached(){
    let parent = this.selectOwnerComponent()
    console.log(parent)
  }
})

全局通信

globalData

将数据挂载到 app.js,这种方式在开发中很常用。通过getApp(),我们能够在任何一个页面内访问到app实例。

app.js

代码语言:javascript
复制
App({
  globalData:{
    list:[]
  }
})

page1.js

代码语言:javascript
复制
const app = getApp()
Page({
  onLoad(){
    app.globalData.list.push({
      id: 10
    })
  }
})

page2.js

代码语言:javascript
复制
const app = getApp()
Page({
  onLoad(){
    console.log(app.globalData.list) // [{id:10}]
  }
})

storage

storage并不是作为通信的主要方式。storage 主要是为了缓存数据,并且最多只能存储10M的数据,我们应该合理使用storage

代码语言:javascript
复制
wx.setStorageSync('timestamp', Date.now())
wx.getStorageSync('timestamp')
wx.removeStorageSync('timestamp')

eventBus

通过发布订阅模式注册事件和触发事件进行通信

简单实现

代码语言:javascript
复制
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

代码语言:javascript
复制
import EventBus from '/util/EventBus'

wx.$bus = new EventBus()

page1.js

代码语言:javascript
复制
Page({
  onLoad(){
    wx.$bus.on('add', this.addHandler)
  },
  addHandler(a, b){
    console.log(a+b)
  }
})

page2.js

代码语言:javascript
复制
Page({
  onLoad(){
    wx.$bus.emit('add', 10, 20)
  },
})

页面通信

getCurrentPages

getCurrentPages() 获取当前页面栈,数组中第一个元素为首页,最后一个元素为当前页面

元素为一个对象,里面存放着页面的信息,包括route(页面路径)、options(onLoad拿到的参数)、method、data等

代码语言:javascript
复制
Page({
  onLoad(){
    let pages = getCurrentPages()
    let lastPage = pages[pages.length-2]
    lastPage.setData({
      list: []
    })
  }
})

写在最后

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 组件通信
    • properties
      • triggerEvent
        • selectComponent
          • selectOwnerComponent
          • 全局通信
            • globalData
              • storage
                • eventBus
                  • 简单实现
                  • 使用
              • 页面通信
                • getCurrentPages
                • 写在最后
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档