寫在前面:我一開始看不懂官網的@computed的作用,因為即使我把@computed去掉,依然能正確的report,然后我百度谷歌都找不到答案,下面都是我自己的理解,如果是有問題的,不對的,請務必留言幫我指出。
官網dome:
import React, { Component } from 'react';
import mobx, {observable, computed } from 'mobx';
class ObservableTodoStore {
@observable todos = [];
@observable pendingRequests = 0;
constructor() {
mobx.autorun(() => console.log(this.report));
}
// get completedTodosCount()
@computed get completedTodosCount() {
console.log('completed')
return this.todos.filter(
todo => todo.completed === true
).length;
}
@computed get report() {
console.log('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();
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";
運行結果:

我的發現:
請留意第三行,改變了completed,先執行的函數回事completedTodosCount(),
第五行,只改變todos的task屬性,完成進度沒有改變,completedTodosCount()根本就不執行,
若把completedTodosCount的@computed去掉,則每次console report后都緊接着console completed;
所以我得到了下面的結論
// completedTodosCount 本來只是一個變量,因為使用了getter/setter,在該變量get/set的時候會執行函數, // report函數get了沒有使用@computed的completedTodosCount,所以每一次get都會執行getter函數(getter函數只是一個普通的getter函數), // 若使用了@computed, 每當你調用completedTodosCount時, // @computed會先判斷getter函數里面的依賴是否發生改變,選擇性執行getter函數,或者使用之前的值
討論群,大大的回答

討論的結論:
completedTodosCount也跟observable一樣是一個被監聽的值,只是他是從observable數據中導出來的,除此之外跟observable是一樣一樣的
至此:由於沒有找到官方一點的解釋,這個結論是我自己的結論。如果是有問題的,請留言幫我指出來。拜托了。
