微信小程序 Mobx實(shí)現(xiàn)數(shù)據(jù)共享

1. 定義:全局?jǐn)?shù)據(jù)共享(又叫做:狀態(tài)管理)是為了解決組件之間數(shù)據(jù)共享的問(wèn)題。開(kāi)發(fā)中常用的全局?jǐn)?shù)據(jù)共享方案有:Vuex环肘、Redux校套、MobX 等仁讨。而我們微信小程序常用的全局共享方案是:MobX

image.png

我們可以通過(guò)上面這張圖清除的看到,如果不使用MobX全局?jǐn)?shù)據(jù)共享的話灭袁,如果需要調(diào)用某個(gè)組件猬错,則需要一層一層調(diào)用,如果定義了全局?jǐn)?shù)據(jù)共享茸歧,那么可以直接拿到數(shù)據(jù)倦炒,不需要一層一層調(diào)用

2. 全局?jǐn)?shù)據(jù)共享的具體方案

在小程序中,可使用 mobx-miniprogram 配合 mobx-miniprogram-bindings 實(shí)現(xiàn)全局?jǐn)?shù)據(jù)共享软瞎。其中:
mobx-miniprogram 用來(lái) 創(chuàng)建 Store 實(shí)例對(duì)象
mobx-miniprogram-bindings 用來(lái) 把 Store 中的共享數(shù)據(jù)或方法 析校, 綁定到組件或頁(yè)面中使用

3. 使用

  • 安裝npm包步驟:
    執(zhí)行命令:npm i --save mobx-miniprogram@4.13.2 mobx-miniprogram-bindings@1.2.1

  • MobX 相關(guān)的包安裝完畢之后,然后通過(guò)如下圖重新構(gòu)建npm


    image.png
  • 構(gòu)建npm報(bào)錯(cuò)铜涉,控制臺(tái)執(zhí)行命令: npm init -y處理

4.創(chuàng)建store.js

1.在根目錄中創(chuàng)建store文件夾智玻,文件夾下創(chuàng)建store.js文件
2.store.js文件中引入mobx-miniprogram中的 observable、action

import {
  observable,
  action
} from 'mobx-miniprogram'

export const store = observable({
  // 字段/數(shù)據(jù)
count1: 1,
count2: 2,
// 計(jì)算屬性:用get定義芙代,(只讀不能修改)
    get count_sum() {
        return this.count1 + this.count2
    },
  // action方法:用來(lái)修改store中的值
  updateCount1: action(function (step) {
      this.count1 += step
  })
})

頁(yè)面中:使用store(Page頁(yè)面中)

1.使用store數(shù)據(jù)的頁(yè)面( .js 文件中):
  • 引入store.js文件
  • 引入 mobx-miniprogram-bindings 中的 createStoreBindings方法(參數(shù)如下)吊奢,并將其掛在到 storeBindings 變量上(頁(yè)面卸載的時(shí)候做清理使用)
  • 將方法綁定到 createStoreBindings 方法的fields與actions上
  • 用 this.方法 / this.屬性 調(diào)用
import { createStoreBindings } from "mobx-miniprogram-bindings"
import { store } from '../../store/store.js'
 
Page({
 // 點(diǎn)擊事件
    addCount(e) {
        // 獲取傳入值: e.target.dataset 
        this.updateCount1(e.target.dataset.addstep)
    },
    onLoad: function () {
        this.storeBindings = createStoreBindings(this, {
            store, // 數(shù)據(jù)源(將store中的某些字段、方法綁定到當(dāng)前頁(yè)面中)
            fields: ['count1'], // 將哪些字段綁定到此頁(yè)面中進(jìn)行使用
            actions: ['updateCount1'] // 將哪些方法綁定到此頁(yè)面中
        })
    },
    onUnload: function () {
        this.storeBindings.destroyStoreBingds()
    },
})

2.使用store數(shù)據(jù)的頁(yè)面( .wxml 文件中):(操作效果:點(diǎn)擊頁(yè)面中’store_count +1‘按鈕纹烹,store_count會(huì)與store_count_sum的值一起增加)
<!-- 獲取 store 中共享數(shù)據(jù) -->
<view>{{count1}} + {{count2}} = {{count_sum}}</view>
<!-- 綁定addCount方法页滚,傳入+=Num。
     方法中:
            1.在e.target.dataset中獲取傳入的數(shù)據(jù)铺呵。
            2. 執(zhí)行storeBindings變量 action中的 updateCount1方法裹驰,讓store中的count1 +2  
-->
<button bindtap="addCount" data-addStep='{{2}}'>count1 +1</button>

組件中:使用store(Component組件中)

1.使用store數(shù)據(jù)的頁(yè)面( .js 文件中):
  • 引入store.js文件
  • 引入 mobx-miniprogram-bindings 中的 storeBindingsBehavior方法(注意:與頁(yè)面引入的方法不同)
  • 將 storeBindingsBehavior 綁定到behaviors上。( 通過(guò) storeBindingsBehavior 來(lái)實(shí)現(xiàn)自動(dòng)綁定 )
  • 用 this.方法 / this.屬性 調(diào)用片挂。注意:調(diào)用名稱都為(fields幻林、actions)中重新定義的名稱贞盯,如:num1、count_sum沪饺、getSum等躏敢。【非store中定義的字段/方法名稱】U稀<唷!沒(méi)必要保持一致
import { storeBindingsBehavior } from "mobx-miniprogram-bindings"
import { store } from '../../store/store'
Component({
    behaviors:[storeBindingsBehavior], // 通過(guò) storeBindingsBehavior 來(lái)實(shí)現(xiàn)自動(dòng)綁定

    storeBindings:{  
        store,// 指定要綁定的 store
        fields:{ // 指定要綁定的字段數(shù)據(jù)
            count1:()=>store.count1, // 第一種寫(xiě)法(了解即可)
            count2:(store)=>store.count2, // 第二種寫(xiě)法(了解即可)
            count_sum:'count_sum' // 第三種寫(xiě)法(推薦精簡(jiǎn))
        },
        actions:{ // 指定要綁定的方法
            getSum:'updateCount1'// 結(jié)構(gòu):自己定義的名(隨便起,合法就行) : store 中的方法
        }
    },
    methods: {
       addCount(){
            this.getSum(8)//調(diào)用store中的方法遭居。調(diào)用名稱為當(dāng)前頁(yè)面重新定義的名稱
        }
    }
})
2.使用store數(shù)據(jù)的頁(yè)面( .wxml 文件中)
<view>{{count1}} + {{count2}} = {{count_sum}}  </view>
<van-button bindtap="addCount" >add +8 </van-button>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啼器,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俱萍,更是在濱河造成了極大的恐慌端壳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鼠次,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡芋齿,警方通過(guò)查閱死者的電腦和手機(jī)腥寇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)觅捆,“玉大人赦役,你說(shuō)我怎么就攤上這事≌こ矗” “怎么了掂摔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)赢赊。 經(jīng)常有香客問(wèn)我乙漓,道長(zhǎng),這世上最難降的妖魔是什么释移? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任叭披,我火速辦了婚禮,結(jié)果婚禮上玩讳,老公的妹妹穿的比我還像新娘涩蜘。我一直安慰自己,他們只是感情好熏纯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布同诫。 她就那樣靜靜地躺著,像睡著了一般樟澜。 火紅的嫁衣襯著肌膚如雪误窖。 梳的紋絲不亂的頭發(fā)上叮盘,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音贩猎,去河邊找鬼熊户。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吭服,可吹牛的內(nèi)容都是我干的嚷堡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼艇棕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蝌戒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起沼琉,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤北苟,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后打瘪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體友鼻,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年闺骚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了彩扔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡僻爽,死狀恐怖虫碉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胸梆,我是刑警寧澤敦捧,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站碰镜,受9級(jí)特大地震影響兢卵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绪颖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一济蝉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧菠发,春花似錦王滤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至糜俗,卻和暖如春踱稍,著一層夾襖步出監(jiān)牢的瞬間曲饱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工珠月, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扩淀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓啤挎,卻偏偏與公主長(zhǎng)得像驻谆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庆聘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容