微信小程序?qū)崿F(xiàn)全局狀態(tài)管理的方法整理
一、前言
在本文開始前請大家先想想在微信小程序中如果要做到全局狀態(tài)共享有幾種實(shí)現(xiàn)方式?
在這里給大家列舉幾種目前已知的方式:
globalData
本地緩存
mobx-miniprogram
westore
globalData和緩存應(yīng)該是大家比較熟悉的,但這二者會隨著項(xiàng)目的不斷迭代逐漸變的混亂和不易維護(hù)。
所以針對此種情況mobx-miniprogram
和westore
應(yīng)運(yùn)而生。因前段時間公司項(xiàng)目剛好用到了mobx-miniprogram
,所以借著公司的業(yè)務(wù)場景本文就展開講一講mobx-miniprogram
,看看mobx-miniprogram
是如何實(shí)現(xiàn)的小程序的全局狀態(tài)管理。
如理解有誤,歡迎評論糾正~
二、使用
mobx-miniprogram 的功能其實(shí)非常純粹與簡單,就是創(chuàng)建一個 store。但將 store 的數(shù)據(jù)映射到頁面或組件時,就需要 mobx-miniprogram-bindings 庫,它類似 react-redux,用于連接 store 與頁面/組件的橋梁。
官方代碼片段:代碼片段
第一步:安裝包文件
npm install --save mobx-miniprogram mobx-miniprogram-bindings yarn add mobx-miniprogram mobx-miniprogram-bindings
第二步:構(gòu)建npm
微信開發(fā)者工具---> 工具---> 構(gòu)建npm
第三步:創(chuàng)建MobX Store
新建一個js文件,這里我們以購物車為例。
我們需全局共享購物車內(nèi)的商品的狀態(tài)、數(shù)量,做到一處修改全局變化。
import { observable, action } from 'mobx-miniprogram'
從 mobx-miniprogram 包中導(dǎo)入 observable
和 action
兩個方法。
- observable: 用于創(chuàng)建 store 的實(shí)例對象
- action: 用于包裹修改 store 數(shù)據(jù)的函數(shù)
// 創(chuàng)建實(shí)例對象 export const chat = observable({ // 定義兩個全局參數(shù) chatList: [], // 購物車商品 totalPrice: 0, // 購物車商品總價(jià) // 初始化購物車 initChat: action(function (list) { this.chatList = list }), // 修改價(jià)格 setPrice: action(function (price) { this.totalPrice = price }), })
第四步 使用、更新store
store的應(yīng)用,在page和component中是兩種不同的方式
page
在page頁面使用,我們需要用到 mobx-miniprogram-bindings
用于連接 store 與page頁面
// 從 mobx-miniprogram-bindings 包中導(dǎo)入?`createStoreBindings`?方法 import { createStoreBindings } from "mobx-miniprogram-bindings" import chat from "../../models/chat" Page({ // onLoad 生命周期鉤子中使用createStoreBindings,把指定 store 中的數(shù)據(jù)字段和更新函數(shù)映射到當(dāng)前頁面 onLoad() { this.chatStore = createStoreBindings(this, { store: chat, fields: ['chatList', 'totalPrice'], actions: ['initChat'] }) }, // fu() { let chat = [ { name: 'XXXX', price: '111' }, { name: 'XXXX', price: '111' } ] this.initChat(chat) }, // 頁面卸載時,銷毀當(dāng)前頁面的 store 綁定 onUnload() { this.chatStore.destroyStoreBindings(); } })
createStoreBindings
方法調(diào)用會返回一個包含 updateStoreBindings
,destroyStoreBindings
兩個函數(shù)的對象,并且賦值給了當(dāng)前頁面實(shí)例的 storeBindings
屬性。
所以,當(dāng)頁面卸載(onUnload)時,調(diào)用 destroyStoreBindings
銷毀當(dāng)前頁面的 store 綁定,避免造成內(nèi)存泄露
在組件中使用、更新 store
與在頁面使用 store 方式不同,在組件中要結(jié)合 behaviors(類似 Vue 中的混入)方式。
從 mobx-miniprogram-bindings 包中導(dǎo)入 storeBindingsBehavior
方法,并在組件選項(xiàng)中定義 storeBindings
字段。
import { storeBindingsBehavior } from "mobx-miniprogram-bindings" import chat from "../../models/chat" Component({ behaviors: [storeBindingsBehavior], storeBindings: { store: chat, fields: ['totalPrice'], actions: ['setPrice'] }, methods: { fn() { this.setPrice(666) } } })
也可以把 storeBindings
設(shè)置為一個數(shù)組,這樣可以同時綁定多個 store
import { storeBindingsBehavior } from "mobx-miniprogram-bindings"; Component({ behaviors: [storeBindingsBehavior], storeBindings: [ { /* 綁定配置 1 */ }, { /* 綁定配置 2 */ }, ], });
三、延遲更新與立即更新
為了提升性能,在 store 中的字段被更新后,并不會立刻同步更新到 this.data 上,而是等到下個 wx.nextTick 調(diào)用時才更新。 這樣可以顯著減少 setData 的調(diào)用次數(shù)。
如果需要立刻更新,可以調(diào)用:
- this.updateStoreBindings() 在組件中
- this.storeBindings.updateStoreBindings() 在頁面中
this.setPrice(666) this.storeBindings.updateStoreBindings() console.log(this.data.totalPrice)
四、store 劃分模塊
隨著項(xiàng)目越大,功能越豐富,項(xiàng)目模塊的狀態(tài)也越多,為了防止在一個 store 中堆積其他模塊的狀態(tài),可根據(jù)功能模塊或職責(zé)劃分多個 store。
比如在 store 目錄下劃分以下模塊:
- userStore.js
- cartStore.js
- orderStore.js
頁面或組件中需要使用和更新哪些 store 模塊的狀態(tài),就導(dǎo)入指定的 store 模塊,作為 store 字段傳遞給 createStoreBindings 或 storeBindingsBehavior 即可。
createStoreBindings(this, {store: xxx}) storeBindings: { store: xxx, }
以上就是微信小程序?qū)崿F(xiàn)全局狀態(tài)管理的方法整理的詳細(xì)內(nèi)容,更多關(guān)于小程序全局狀態(tài)管理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JS組件Bootstrap實(shí)現(xiàn)下拉菜單效果代碼
這篇文章主要為大家詳細(xì)介紹了JS組件Bootstrap實(shí)現(xiàn)下拉菜單效果代碼,感興趣的小伙伴們可以參考一下2016-04-04使用javascript實(shí)現(xiàn)雪花飄落的效果
本文主要介紹了使用javascript實(shí)現(xiàn)雪花飄落的特效,雖然網(wǎng)上有很多,不過都是比較陳舊了,兼容性不是太好,于是動手寫一個,把思路和實(shí)現(xiàn)代碼都分享給大家。2015-01-01微信小程序wxml不能使用Array.includes條件判斷解決方法
這篇文章主要為大家介紹了微信小程序wxml不能使用Array.includes條件判斷解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11記一次webpack3升級webpack4的踩坑經(jīng)歷
這篇文章主要介紹了記一次webpack3升級webpack4的踩坑經(jīng)歷,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06純js實(shí)現(xiàn)的論壇常用的運(yùn)行代碼的效果
bluidea論壇的腳本板塊的版主寫的,不錯,轉(zhuǎn)到這!2008-07-07基于Node.js的JavaScript項(xiàng)目構(gòu)建工具gulp的使用教程
也許你使用過grunt,那么這里來安利gulp的話就更加不會陌生了,下面我們就來看一下基于Node.js的JavaScript項(xiàng)目構(gòu)建工具gulp的使用教程2016-05-05JavaScript使用canvas繪制坐標(biāo)和線
這篇文章主要為大家詳細(xì)介紹了JavaScript使用canvas繪制坐標(biāo)和線,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04