【问题标题】:MobX. @observable works but @computed don'tMobX。 @observable 有效,但 @computed 无效
【发布时间】:2020-05-14 06:53:42
【问题描述】:

我有以下代码: 如果_isFavorite 变量是public observable,它工作正常。但是一旦我将其更改为@computed,它只会触发一次。但进一步的@action 调用不会触发@computed。

一旦isFarovite 被更改,这工作正常:

class Cat {
    @observable public isFavorite = false;

    constructor() { ... }

    @action public toggleFavorite() {
        this.isFavorite = !this.isFavorite;
    }
}

如果 _isFavorite 被更改,这将不起作用:

class Cat {
    private _isFavorite = false;

    constructor() { ... }

    @computed public get isFavorite() {
        return this._isFavorite;
    }

    @action public toggleFavorite() {
        this._isFavorite = !this._isFavorite;
    }
}

我想我可能会错过“计算”如何工作的核心概念,但我不知道应该如何更改我的代码...

【问题讨论】:

    标签: reactjs mobx mobx-react


    【解决方案1】:

    这是因为computed 值应该应用于某些observables。

    它实际上检查其中使用了哪些observables,并将自己注册为它的观察者并缓存结果。

    class Cat {
        @observable private _isFavorite = false;
    
        constructor() { ... }
    
        @computed public get isFavorite() {
            return this._isFavorite;
        }
    
        @action public toggleFavorite() {
            this._isFavorite = !this._isFavorite;
        }
    }
    

    【讨论】:

    • 谢谢!确实有效。将私有变量标记为 @observable 对我来说并不明显,因为它不直接在 render() 方法中使用。
    • 它与私有/公共无关,而是与它在观察者中使用的事实有关,正如我所解释的,computed 与组件上的observer 相同:]跨度>
    猜你喜欢
    • 1970-01-01
    • 2017-01-08
    • 2012-05-08
    • 2017-03-15
    • 2014-10-30
    • 2011-03-08
    • 2013-11-27
    • 2010-11-29
    • 2017-12-13
    相关资源
    最近更新 更多