MobX中@computed和自定义get函数的区别

在学习MobX的过程中发现了一个问题。
首先编写如下代码:

import { observable, computed } from 'mobx';

export default class AppState {
  @observable value = 0;
  addValue() {
    this.value ++;
  }
  subValue() {
    this.value --;
  }
  @computed get getValue() {
    return this.value * 10;
  }
  getTheValue() {
    return this.value * 10;
  }
}
<div>
    <p>{appState.value}</p>
    <p>{appState.getValue}</p>
    <p>{appState.getTheValue()}</p>
    <button onClick={() => appState.addValue()}>增加</button>
    <button onClick={() => appState.subValue()}>减少</button>
</div>

我想返回一个计算过的值,按照官方文档上说的,是用@computed get来进行操作,毫无疑问这是可行的。但是自己实践发现,自己编写一个普通的get函数,用来return出一个计算过的值,也能实现相同的效果。不知两者有何区别,遂谷歌了一波。发现如下链接:https://github.com/mobxjs/mobx/issues/161

简单说下帖子里讲得东西。
帖子里的代码也是一个和我类似的这么一个情形,作者也在问这两者的区别。
下面有个优秀的回复提到了以下的内容:
首先这两者解决方法都会得到一个相同的结果,但使用@computed的意义在于它能够由MobX进行更智能的优化。
如果我不使用computed属性,直接使用自定义的getTheValue函数的话,那么一旦value改变,所有用到getTheValue函数的地方都将重新计算。
如果使用了@computed get getValue,那么getValue将会被缓存,如果value的变化没有出发getValue的变动,那么getValue就不会改变,其它组件也不会收到通知。
此外如果你读取getValue的值,你通常会得到一个缓存的值,而不带@computed装饰器,则会重新计算……

更直观的例子:

const number = observable(10);
const plus = computed(() => number.get() > 0);

autorun(() => {
  console.log(plus.get());
});

number.set(-19);
number.set(-1);
number.set(1);

依次输出了true,false,true。
第一个true是number初始化值的时候,10>0为true没有问题。
第二个false将number改变为-19,输出false,也没有问题。
但是当-19改变为-1的时候,虽然number变了,但是number的改变实际上并没有改变plus的值,所以没有其它地方收到通知,因此也就并没有输出任何值。
直到number重新变为1时才输出true。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值