狀態管理庫MobX和react
MobX
- MobX 是一個簡單、方便擴充套件、久經考驗的狀態管理解決方案
基本概念
-
MobX 是一個獨立的元件,可以配合各種框架使用,由於專案中需要使用 react & MobX。下面來詳細瞭解一下
-
State 是每一個應用程式的核心部分,而使用一個不合規範的 State 則是讓你的應用充滿 bug 和失控的不二法門,或者就是區域性變數環繞,讓你的 state 失去了同步。有很多框架試圖解決這個問題,比如使用不可變的 state,但是這樣以來又帶來了新的問題,比如資料必須規格化,完整性約束失效等等。
MobX 功能
-
MobX 讓整個事情又變簡單了:它不允許產生失控的 state。它的理念也很簡單:所有可以從 state 中派生的事物,都會自動的派生。
-
demo
class TodoStore {
todos = [];
get completedTodosCount() {
return this.todos.filter(
todo => todo.completed === true
).length;
}
report() {
if (this.todos.length === 0)
return "<none>";
return `Next todo: "${this.todos[0].task}". ` +
`Progress: ${this.completedTodosCount}/${this.todos.length}`;
}
addTodo(task) {
this.todos.push({
task: task,
completed: false,
assignee: null
});
}
}
const todoStore = new TodoStore();
當我們去建立一個 todoStore,他擁有一個 todos 集合,現在我們往這個 todoStore 裡新增一些東西,為了明顯起見,就呼叫 todoStore.report
todoStore.addTodo("read MobX tutorial");
console.log(todoStore.report());
todoStore.addTodo("try MobX");
console.log(todoStore.report());
todoStore.todos[0].completed = true;
console.log(todoStore.report());
todoStore.todos[1].task = "try MobX in own project";
console.log(todoStore.report());
todoStore.todos[0].task = "grok MobX tutorial";
console.log(todoStore.report());
太巧了,這就是 MobX 能為你做的事情。自動執行只在 state 改變的時候觸發,就好像 Excel 中的圖表只在單元格資料改變時更新一樣。為了達到這個目標,
TodoStore
必須成為可觀測的(observable
)才行,讓我們來改一些程式碼。observable & computed
同時,completedTodosCount 屬性應該被自動派生,使用 @observable 和 @computed 裝飾器來做這些事情:
class ObservableTodoStore {
@observable todos = [];
@observable pendingRequests = 0;
constructor() {
mobx.autorun(() => console.log(this.report));
}
@computed get completedTodosCount() {
return this.todos.filter(
todo => todo.completed === true
).length;
}
@computed get report() {
if (this.todos.length === 0)
return "<none>";
return `Next todo: "${this.todos[0].task}". ` +
`Progress: ${this.completedTodosCount}/${this.todos.length}`;
}
addTodo(task) {
this.todos.push({
task: task,
completed: false,
assignee: null
});
}
}
const observableTodoStore = new ObservableTodoStore();
在這個構造器中,我們使用
測試一下
autorun
包裹了一個打出 report
的小函式。Autorun
裡的東西首先會執行一次,然後當其中的函式有 observable
的資料發生變化時,會再次執行。 這裡我們使用了 todos
屬性,每次 todos
變化了我們就列印出新的東西。測試一下
observableTodoStore.addTodo("read MobX tutorial");
observableTodoStore.addTodo("try MobX");
observableTodoStore.todos[0].completed = true;
observableTodoStore.todos[1].task = "try MobX in own project";
observableTodoStore.todos[0].task = "grok MobX tutorial";
舉個例子(sf 的一個問題有感)
- 對於單個物件,我可以使用computed通過計算獲得一些屬性,比如
@observable good = {
number: 2,
price: 3
}
@computed get totalPrice() {
return this.good.number * this.good.price;
}
// 陣列
@observable goodsList = [{
number: 2,
price: 3
},{
number: 2,
price: 3
}]
問題?
- 這種情況我如何通過computed獲得陣列某個元素的計算屬性呢,還是隻能在改變number的函式中手動去更改,但是我陣列的物件中並沒有一個totalPrice的屬性,每次把單個good push到goodsList中去還要給good新增一個totalPrice屬性豈不是很麻煩
解決方案
- 把
good
弄成一個單獨的model檔案
export default class Good{
@observable number;
@observable price;
constructor(number, price) {
this.number = number;
this.price = price;
}
@computed
get totalPrice() {
return this.number * this.price
}
}
-
- 然後在goodList檔案中
- 這樣就實現了自動計算, 訪問的時候類似 this.props.goodList[0].totalPrice
@action
addGood(...args) {
this.todos.push(new Good(...args));
}
- 未完待續…
總結
- 最後總結一些:
-
@observale
修飾器或者 observable 函式讓物件可以被追蹤; -
@computed
修飾器創造了自動運算的表示式; -
autorun
函式讓依靠 observable 的函式自動執行,這個用來寫 log,發請求很不錯; -
@observer
修飾器讓React
組建自動起來,它會自動更新,即便是在一個很大的程式裡也會工作的很好;
-
MobX
不是一個狀態容器
很多人把 MobX
當作另外一個 Redux
,但是它僅僅是一個庫,不是一個什麼架構。上面的例子還是需要程式設計師自己去組織邏輯和 store
或者控制器什麼的.
引用:
原文釋出時間為:2018年06月27日
原文作者:Pandaaa
本文來源:掘金 如需轉載請聯絡原作者
相關文章
- 狀態管理庫 MobX 和 reactReact
- React開發日記-React Hook/Mobx 資料狀態管理對比ReactHook
- mobx-簡單可擴充套件的狀態管理庫套件
- 理解 React 輕量狀態管理庫 UnstatedReact
- React的狀態管理React
- React 狀態管理:狀態與生命週期React
- Facebook 新一代 React 狀態管理庫 RecoilReact
- react之redux狀態管理ReactRedux
- 2020 年 React 狀態管理React
- React狀態管理之ContextReactContext
- 兩張圖帶你全面瞭解React狀態管理庫:zustand和jotaiReactAI
- React hooks 狀態管理方案解析ReactHook
- React 路由狀態管理總結React路由
- 新的React狀態庫:focaReact
- 你再也不用使用 Redux、Mobx、Flux 等狀態管理了Redux
- React 4 種狀態型別及 N 種狀態管理React型別
- React — zustand狀態管理工具React
- React Context API: 輕鬆管理狀態ReactContextAPI
- React 回憶錄(四)React 中的狀態管理React
- React 快速上手 - 08 redux 狀態管理 react-reduxReactRedux
- 淺談前端的狀態管理,以及anguar的狀態管理庫前端
- 基於Redux/Vuex/MobX等庫的通用化狀態OOPReduxVueOOP
- 基於React Context Api 和 Es6 Proxy的狀態管理ReactContextAPI
- 掘金 AMA:聽《React 狀態管理和同構實戰》作者--LucasHC 說 React 和前端那些事React前端
- typescript + react 專案開發體驗之 react狀態管理TypeScriptReact
- [譯] ⚛ React 狀態管理工具博物館React
- Vue狀態管理庫Pinia詳解Vue
- vuex管理狀態倉庫詳解Vue
- 極簡Flutter狀態管理庫:consumerFlutter
- 談談RxSwift和狀態管理Swift
- React中的另一種狀態管理方案ValtioReact
- React MobX 開始React
- React-mobx解析React
- 狀態管理
- 借鑑redux,實現一個react狀態管理方案ReduxReact
- React新Context API在前端狀態管理的實踐ReactContextAPI前端
- 再見了 Redux、Recoil、MobX、Zustand、Jotai 還有 Valtio,狀態管理還可以這樣做?ReduxAI
- 輕量級狀態管理庫Pinia試吃