写在前面:我一开始看不懂官网的@computed的做用,由于即便我把@computed去掉,依然能正确的report,而后我百度谷歌都找不到答案,下面都是我本身的理解,若是是有问题的,不对的,请务必留言帮我指出。react
官网dome:dom
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";
运行结果:函数
个人发现:this
请留意第三行,改变了completed,先执行的函数回事completedTodosCount(),spa
第五行,只改变todos的task属性,完成进度没有改变,completedTodosCount()根本就不执行,code
若把completedTodosCount的@computed去掉,则每次console report后都紧接着console completed;blog
因此我获得了下面的结论get
// completedTodosCount 原本只是一个变量,由于使用了getter/setter,在该变量get/set的时候会执行函数, // report函数get了没有使用@computed的completedTodosCount,因此每一次get都会执行getter函数(getter函数只是一个普通的getter函数), // 若使用了@computed, 每当你调用completedTodosCount时, // @computed会先判断getter函数里面的依赖是否发生改变,选择性执行getter函数,或者使用以前的值
讨论群,大大的回答console
讨论的结论:class
completedTodosCount也跟observable同样是一个被监听的值,只是他是从observable数据中导出来的,除此以外跟observable是同样同样的
至此:因为没有找到官方一点的解释,这个结论是我本身的结论。若是是有问题的,请留言帮我指出来。拜托了。