博客 / 詳情

返回

小程序中使用 MobX 綁定輔助庫

點擊前往小程序MobX的官方文檔

注:此 behavior 依賴開發者工具的 npm 構建。 什麼是npm構建?

安裝 mobx-miniprogrammobx-miniprogram--bindings

npm install --save mobx-miniprogram mobx-miniprogram-bindings

點擊微信開發者工具左上角:工具 --- npm 構建

構建完成後,兩個文件夾下 mobx-xxxxx 的4個包都已經就緒

在這裏插入圖片描述

創建 MobX Store:新建store.js,並實例化 observable

observable 是默認的 MobX store

在這裏插入圖片描述

// store.js
import { observable, action } from 'mobx-miniprogram'

// 創建store並暴露出去
// observable:默認的 MobX store
export const store = observable({

  // 數據data
  numA: 1,
  numB: 2,

  // 計算屬性
  get sum() {
    return this.numA + this.numB
  },

  // 通過 action 聲明
  update: action(function () {
    const sum = this.sum
    this.numA = this.numB
    this.numB = sum
  })
})

store創建好了,接下來就是怎麼綁定的問題了

綁定配置

無論使用哪種綁定方式,都必須提供一個綁定配置對象,參數如下:

  • store:默認的 MobX store
  • fields:用於指定需要綁定的 data 字段。數組或者對象(數組、映射、函數)
  • actions: 用於指定需要映射的 actions。數組或者對象(數組、映射)

廢話不多説,直接看例子

手工綁定:通過 createStoreBindings (適用於全部場景)

注意: 在頁面 onUnload (自定義組件 detached )時一定要調用清理函數 destroyStoreBindings,否則將導致內存泄漏!

// page.js
import { createStoreBindings } from 'mobx-miniprogram-bindings'
import { store } from './../../store/store'

Page({
  data: {
  },
  onLoad() {
      // 傳入指針 this 實例化
    this.storeBindings = createStoreBindings(this, {
      store,
      // 數組形式需要與data同名
      fields: ['numA', 'numB', 'sum'], 
      actions: ['update'], 
    })
  },
  onUnload() {
    this.storeBindings.destroyStoreBindings()
  },
  // 可以在method的合適時機,去調用update
  myMethod() {
    this.update()
  }
})

store中的 numA numB sumupdatepage.js 和對應的 page.wxml 中 即可正常使用

behavior綁定:通過storeBindingsBehavior(適用於 Component 構造器)

// component.js
import { storeBindingsBehavior } from 'mobx-miniprogram-bindings'
import { store } from '../../../store/store'

Component({
  // 固定寫法
  behaviors: [storeBindingsBehavior],
  data: {
    someData: '...'
  },
  
  storeBindings: {
    store,
    // 函數形式,可另外聲明變量
    fields: {
      numA: () => store.numA,
      numB: (store) => store.numB,
      sum: 'sum'
    },
    // 映射形式,可另外聲明變量
    actions: {
      buttonTap: 'update'
    },
  },
  methods: {
    add() {
      // buttonTap 即 update
      this.buttonTap()
    }
  }
})

fields、actions如果使用數組,需要與store中同名;如果使用對象,可單獨聲明變量

延遲更新與立刻更新

為了提升性能,在 store 中的字段被更新後,並不會立刻同步更新到 this.data 上,而是等到下個 wx.nextTick 調用時才更新。(這樣可以顯著減少 setData 的調用次數。)
如果需要立刻更新,可以調用:

  • this.updateStoreBindings() (在 behavior 綁定 中)
  • this.storeBindings.updateStoreBindings() (在 手工綁定 中)
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.