просто мобх говнище сраное
Хейт в сторону mobx необоснованный. Mobx это тоже самое что и редакс если бы в приложении был бы не один редакс-стор а много. И mobx такой же простой и отслеживаемый как и redux.
Как работает redux - у нас есть единый стор и единый список подписчиков-коннектов и при изменения этого стора вызываются все коннекты где каждый коннект сравнивает в mapStateToProps изменился ли нужный срез данных и принимает решение о том нужно ли вызывать перерендер компонента.
В связи с этим возникает проблема - либо мы будем чуть ли не каждый компонент коннектить к стору и тогда редаксу при каждом изменении нужно будет вызывать тысячи mapStateToProps по всему приложению и это будет тормозить либо мы будем коннектить к стору не все компоненты а только контейнеры аггрегируя проверяемый на изменения срез данных но тогда получится что при изменении каких-то данных будет происходить перерендер всего контейнер-компонента хотя от данных зависит только один маленький компонент внутри контейнер-компонента.
А что если мы будем создавать отдельный redux-стор на каждую ячейку данных? Теперь когда что-то изменилось достаточно вызвать только тот небольшой список коннектов которые зависят от этой ячейки данных в отличие от тысяч коннкетов по всему приложению как делает редакс.
Вот пример
import React from "react";
import { render } from "react-dom";
import { createStore } from "redux";
import { Provider, connect } from "react-redux";
const reducer = (state, action) => {
if (action.type === "setValue") {
return action.value;
}
};
const observer = (store, Component) => {
const ConnectedComponent = connect(
state => ({ value: state }),
dispatch => ({ setValue: value => dispatch({ type: "setValue", value }) })
)(Component);
return props => (
<Provider store={store}>
<ConnectedComponent {...props} />
</Provider>
);
};
const User = {
firstName = createStore(reducer, "");
lastName = createStore(reducer, "");
};
const FistNameInput = observer(User.firstName, ({ setValue, value }) => (
<div>
<input value={value} onChange={e => setValue(e.target.value)} />
</div>
));
const LastNameInput = observer(User.lastName, ({ setValue, value }) => (
<div>
<input value={value} onChange={e => setValue(e.target.value)} />
</div>
));
const App = () => (
<div>
<FistNameInput />
<LastNameInput />
</div>
);
render(<App />, document.getElementById("root"));Здесь мы создали отдельный редакс-стор для поля firstName и отдельный редакс-стор для поля lastName. И теперь изменения одного из них потребует вызова только тех подписчиков которые зависят от этого поля а не абсолютно всех коннектов как если бы у нас был только один redux-стор.
Теперь вопрос - здесь есть магия? Насколько все неочевидно, непонятно что происходит т.д ? А ведь пример на мобиксе полностью аналогичен примеру на редаксе
import React from "react";
import ReactDOM from "react-dom";
import {observable} from "mobx";
import {observer} from "mobx-react"
const User = {
firstName: observable.box("");
lastName: observable.box("");
};
const FistNameInput = observer(() => (
<div>
<input value={User.firstName.get()} onChange={e => User.firstName.set(e.target.value) } />
</div>
));
const LastNameInput = observer(() => (
<div>
<input value={User.lastName.get()} onChange={e => User.lastName.set(e.target.value)} />
</div>
));
const App = () => (
<div>
<FistNameInput />
<LastNameInput />
</div>
);
const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);Где здесь зацикленные апдейты или невозможность проследить что происходит?
Что в redux что в mobx совершенно одинаковый механизм работы - компонент подписывается на нужный ему стор и стор при изменении обновляет список подписанных на него компонентов. Единственная разница в том что в редаксе принято создавать один стор а в мобиксе по стору на каждую ячейку данных. Ну и еще то что в mobx подписка на стор происходит в момент вызова .get() в рендере благодаря чему когда в компоненте что-то рендерится по условию то mobx отписывает