Mobx的计算/反应上下文与事件处理程序?

时间:2018-10-18 17:27:00

标签: javascript mobx

对于MobX,@computed属性仅在从observer或反应性上下文访问时才被缓存。例如:

class Foo {
    @computed
    get somethingExpensive() { return someReallyExpensiveOperation() }
}

const f = new Foo();
setInterval(() => console.log(f.somethingExpensive), 1);

将始终调用someReallyExpensiveOperation(),因为computed在响应上下文之外被调用。

是否有办法“输入”反应性上下文以获得@computed回调,setTimeout事件处理程序等的EventEmitter的好处?

编辑:另一种放置方式..如果我将装饰器更改为

class Foo {
    @computed({ requiresReaction: true })
    get somethingExpensive() { return someReallyExpensiveOperation() }
}

..当从setInterval示例访问时,它将抛出。

1 个答案:

答案 0 :(得分:0)

我使用立即处置的autorun

autorun((reaction) => {
    console.log(f.somethingExpensive)
    reaction.dispose()
})

也做了一个npm module

import runInReactiveContext from 'mobx-run-in-reactive-context'

// ...

runInReactiveContext(() => {
    console.log(f.somethingExpensive)
})