MobX 是一個獨立的組件,能夠配合各類框架使用,因爲項目中須要使用 react & MobX。下面來詳細瞭解一下javascript
State 是每個應用程序的核心部分,而使用一個不合規範的 State 則是讓你的應用充滿 bug 和失控的不二法門,或者就是局部變量環繞,讓你的 state 失去了同步。有不少框架試圖解決這個問題,好比使用不可變的 state,可是這樣以來又帶來了新的問題,好比數據必須規格化,完整性約束失效等等。java
MobX 讓整個事情又變簡單了:它不容許產生失控的 state。它的理念也很簡單:全部能夠從 state 中派生的事物,都會自動的派生。react
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());
複製代碼
TodoStore
必須成爲可觀測的(observable
)才行,讓咱們來改一些代碼。同時,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";
複製代碼
@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
}]
複製代碼
問題?框架
解決方案函數
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
}
}
複製代碼
@action
addGood(...args) {
this.todos.push(new Good(...args));
}
複製代碼
@observale
修飾器或者 observable 函數讓對象能夠被追蹤;@computed
修飾器創造了自動運算的表達式;autorun
函數讓依靠 observable 的函數自動執行,這個用來寫 log,發請求很不錯;@observer
修飾器讓 React
組建自動起來,它會自動更新,即使是在一個很大的程序裏也會工做的很好;MobX
不是一個狀態容器不少人把 MobX
看成另一個 Redux
,可是它僅僅是一個庫,不是一個什麼架構。上面的例子仍是須要程序員本身去組織邏輯和 store
或者控制器什麼的.測試