Mobx action
выполняет пакетирование , аналогично тому, как ReactJS группирует несколько изменений.
Когда вы используете обработчик reactjs click
, реакция автоматически пакетирует изменения, которые произойдет внутри него, поэтому вы не увидите рендеринг компонента несколько раз, однако, если вы вызовете setColor
из какого-то другого события, скажем, после загрузки некоторых данных, и у вас будет несколько вызовов для изменения наблюдаемой внутри setColor
, которая вызовет наблюдатель три раза, а компонент будет визуализирован три раза.
Когда вы оберните свою функцию декоратором @action
или используете функцию runInAction
, будет использовано только последнее значение (green
в приведенный ниже код), и компонент будет визуализирован только один раз.
setColor(){
// this will render three times
this.color='blue'
this.color='red'
this.color='green'
}
пример vanilla mobx, который реагирует только один раз:
import { runInAction, observable, reaction, toJS } from "mobx";
const test = observable({
name: "sonic",
nick: "speed demon"
});
// console.log will be called only once with the value "name: 3"
reaction(
() => toJS(test),
data => console.log(`name: ${data.name}`)
);
runInAction(() => {
test.name = "1";
test.name = "2";
test.name = "3";
});
представление на codesandbox
Также ознакомьтесь с обсуждением на репозитории github: действительно ли необходимо @action?