摘要:所以雖然是是用在小程序上,不過我想對于的狀態(tài)管理,也有這么一丟丟啟發(fā)。在目錄下放入和這兩個(gè)庫,同時(shí)在目錄下新建用于存放全局狀態(tài)。建立由于小程序中不支持裝飾器,所以采用了的寫法。另外,小程序中不支持路徑的省略。
what
名字很長很繞靠口,總的來說,本文是對開發(fā)小程序過程中使用mobx的一個(gè)總結(jié)。
狀態(tài)管理,相比大家也很熟悉,顧名思義,是對前端頁面繁復(fù)的狀態(tài)進(jìn)行管理,在此,我也不過多贅述。
所以雖然是是用在小程序上,不過我想對于WebApp的狀態(tài)管理,也有這么一丟丟啟發(fā)。
why為什么要進(jìn)行狀態(tài)管理?
現(xiàn)在的小程序儼然是Hybrid App,又像是PWA,但當(dāng)然也是一個(gè)WebApp,更不用說他的語法和vue略微有這么一丟丟相似。有react和vue的實(shí)踐在前,所以對于小程序上那么多的頁面狀態(tài)和數(shù)據(jù)緩存,勢必也要引入一個(gè)狀態(tài)管理工具
為什么是mobx
方便,快捷,學(xué)習(xí)成本低,當(dāng)然也是仁者見仁智者見智
在小程序中引入mobx
在這里我使用了wechat-weapp-mobx這個(gè)庫。在./libs目錄下放入mobx.js和observer.js這兩個(gè)庫,同時(shí)在./store目錄下新建store.js用于存放全局狀態(tài)。
建立store
由于小程序中不支持@decorate裝飾器,所以采用了extendObservable的寫法。另外,小程序支持import語法和require語法。我比較喜歡import語法,你們呢?我認(rèn)為在action中不該寫入復(fù)雜邏輯代碼,保持簡潔性和可復(fù)用性,你們怎么看
// store.js // 引入必須的庫 const mobx = require("../libs/mobx"); const extendObservable = require("../libs/mobx").extendObservable; const computed = require("../libs/mobx").computed; const toJS = require("../libs/mobx").toJS; let store = function () { extendObservable(this, { // observable data players: [], // computed data get count() { return this.players.length; } }); // action this.addPlayer = name => { let len = this.count; //此處調(diào)用computed data let id = len === 0 ? 1 : this.players[len - 1].id + 1; this.players.push(new player(name, id)); } } export default store;
全局引入store
眾所周知,使用mobx的store要使用new store(),如果我們想全局調(diào)用,勢必不可能在每個(gè)頁面都new一個(gè)sotre,因?yàn)檫@樣的話每個(gè)頁面的store都是一個(gè)全新的store。在這里,我在app.js里引入store,并掛載在全局變量globalData下。另外,小程序中不支持路徑的省略。
//app.js const observer = require("./libs/observer").observer; import store from "./stores/index"; // 小程序中不支持省略調(diào)用 App(observer({ onLaunch: function () { }, globalData: { store: new store() } }))
在pages里調(diào)用全局的store
可以同時(shí)使用內(nèi)置的data進(jìn)行雙向綁定哦
// index.js const observer = require("../../libs/observer").observer; let app = getApp(); Page(observer({ data: { mes: "hello jim green" }, props: { store: app.globalData.store }, }))
在頁面中調(diào)用store
// 調(diào)用observable data {{item.id}}:{{item.name}} {{props.sotre.count}} // 調(diào)用computed data
更新多個(gè)頁面的store
問題來了,這個(gè)時(shí)候,多個(gè)頁面的store還是獨(dú)立的,如何全部更新呢?答案就是在onShow和onHide或者onUnload這三個(gè)生命周期函數(shù)中跟新全局的store
onShow: function() { // 顯示時(shí)更新本頁面store this.props.store = app.globalData.store }, onHide: function() { // 隱藏時(shí)更新全局store app.globalData.store = this.props.store; }, onUnload: function() { // 頁面跳轉(zhuǎn)返回時(shí)更新全局store app.globalData.store = this.props.store; },
store和localStorage的長效存儲(chǔ)
考慮到網(wǎng)絡(luò)還有程序崩潰的問題,我將store存儲(chǔ)在localStorage中以便恢復(fù),我在index.js的onLoad中調(diào)用get storage,在onHide中set storage。由于toJS方法返回了一個(gè)不支持[Symbol.iterator]()的對象,所以在store里進(jìn)行了如下設(shè)置
// index.js onLoad: function () { let store = wx.getStorageSync("store"); if(store) { this.props.store.formStorageToStore(store); } }, onHide: function () { let store =this.props.store.currentStore; wx.setStorageSync("store", store) }, // store.js get currentStore() { let {players,games,currentGame,hidden,filter} = toJS(this); return {players,games,currentGame,hidden,filter}; } this.formStorageToStore = ({players,games,currentGame,hidden,filter}) => { this.players = players; this.games = games; this.currentGame = currentGame; this.hidden = hidden; this.filter = filter; }others
講點(diǎn)其他
本項(xiàng)目的示例小程序地址weapp-bmscore,歡迎各位老鐵點(diǎn)個(gè)關(guān)注666
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/84366.html
摘要:要求通過要求數(shù)據(jù)變更函數(shù)使用裝飾或放在函數(shù)中,目的就是讓狀態(tài)的變更根據(jù)可預(yù)測性單向數(shù)據(jù)流。同一份數(shù)據(jù)需要響應(yīng)到多個(gè)視圖,且被多個(gè)視圖進(jìn)行變更需要維護(hù)全局狀態(tài),并在他們變動(dòng)時(shí)響應(yīng)到視圖數(shù)據(jù)流變得復(fù)雜,組件本身已經(jīng)無法駕馭。今天是 520,這是本系列最后一篇文章,主要涵蓋 React 狀態(tài)管理的相關(guān)方案。 前幾篇文章在掘金首發(fā)基本石沉大海, 沒什么閱讀量. 可能是文章篇幅太長了?掘金值太低了? ...
摘要:將收集到的實(shí)例及各類做標(biāo)識(shí)并做好關(guān)系映射。但這并不意味著在序列化不友好的體系里不能實(shí)現(xiàn)從中喚醒應(yīng)用。最后作為一個(gè)多范式的信徒,在一出現(xiàn)便取代了我心中在前端狀態(tài)管理領(lǐng)域的地位。 原文鏈接 注意:本文并非 mobx-state-tree 使用指南,事實(shí)上全篇都與 MST(mobx-state-tree) 無關(guān)。 showImg(https://segmentfault.com/img/bV...
摘要:我現(xiàn)在寫的這些是為了解決和這兩個(gè)狀態(tài)管理庫之間的困惑。這甚至是危險(xiǎn)的,因?yàn)檫@部分人將無法體驗(yàn)和這些庫所要解決的問題。這肯定是要第一時(shí)間解決的問題。函數(shù)式編程是不斷上升的范式,但對于大部分開發(fā)者來說是新奇的。規(guī)模持續(xù)增長的應(yīng) 原文地址:Redux or MobX: An attempt to dissolve the Confusion 原文作者:rwieruch 我在去年大量的使用...
摘要:新的項(xiàng)目目錄設(shè)計(jì)如下放置靜態(tài)文件業(yè)務(wù)組件入口文件數(shù)據(jù)模型定義數(shù)據(jù)定義工具函數(shù)其中數(shù)據(jù)流實(shí)踐的核心概念就是數(shù)據(jù)模型和數(shù)據(jù)儲(chǔ)存。最后再吃我一發(fā)安利是阿里云業(yè)務(wù)運(yùn)營事業(yè)部前端團(tuán)隊(duì)開源的前端構(gòu)建和工程化工具。 本文首發(fā)于阿里云前端dawn團(tuán)隊(duì)專欄。 項(xiàng)目在最初應(yīng)用 MobX 時(shí),對較為復(fù)雜的多人協(xié)作項(xiàng)目的數(shù)據(jù)流管理方案沒有一個(gè)優(yōu)雅的解決方案,通過對MobX官方文檔中針對大型可維護(hù)項(xiàng)目最佳實(shí)踐的...
摘要:它是由一個(gè)非常聰明的人開發(fā)的,用來緩解在單頁面應(yīng)用中管理狀態(tài)的問題。的問題沒有一種適合所有場景的完美工具。為設(shè)計(jì)的是世界的另一個(gè)新增內(nèi)容,但目前僅適用于。這將導(dǎo)致最后期限延長,并且留下更多需要我們維護(hù)的代碼。 原文:The Problems with Redux: Can React, MobX, and Realm save us? 作者:Erich Reich 首先,我不討厭 ...
閱讀 1533·2023-04-26 02:03
閱讀 4723·2021-11-22 13:53
閱讀 4600·2021-09-09 11:40
閱讀 3798·2021-09-09 09:34
閱讀 2133·2019-08-30 13:18
閱讀 3509·2019-08-30 11:25
閱讀 3303·2019-08-26 14:06
閱讀 2552·2019-08-26 13:52