вычисляемый / реактивный контекст mobx с обработчиками событий? - PullRequest
0 голосов
/ 18 октября 2018

В 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 голосов
/ 27 мая 2019

Я использую мгновенно утилизируемый autorun:

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

Также сделан модуль npm :

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

// ...

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