Итак, я начал изучать React неделю назад, и я неизбежно дошел до проблемы состояния и того, как компоненты должны взаимодействовать с остальной частью приложения. Я искал вокруг, и Redux, кажется, был ароматом месяца. Я прочитал всю документацию, и я думаю, что это действительно революционная идея. Вот мои мысли об этом:
Государство в целом соглашается быть довольно злым и большим источником ошибок при программировании. Вместо того, чтобы рассеивать все это во всем приложении, Redux говорит, почему бы просто не сконцентрироваться в глобальном дереве состояний, что вы должны испускать действия для изменения? Звучит интересно. Все программы нуждаются в состоянии, поэтому пусть вставляет его в одно нечистое пространство и только модифицирует его изнутри, поэтому ошибки легко отслеживать. Затем мы также можем декларативно связывать отдельные фигуры государства, чтобы реагировать на компоненты и автоматически их перерисовывать, и все красиво.
Однако у меня есть два вопроса об этом дизайне. Во-первых, почему дерево состояний должно быть неизменным? Скажем, меня не волнует отладка во время путешествия, горячая перезагрузка и уже реализовано отменить/повторить в моем приложении. Просто кажется, что это так громоздко:
case COMPLETE_TODO:
return [
...state.slice(0, action.index),
Object.assign({}, state[action.index], {
completed: true
}),
...state.slice(action.index + 1)
];
Вместо этого:
case COMPLETE_TODO:
state[action.index].completed = true;
Не говоря уже о том, что я делаю онлайн-доску просто для изучения, и каждое изменение состояния может быть таким же простым, как добавление штриха кисти в список команд. Через некоторое время (сотни мазков кисти) дублирование всего этого массива может стать чрезвычайно дорогостоящим и трудоемким.
Я в порядке с деревом глобального состояния, которое не зависит от пользовательского интерфейса, который мутируется с помощью действий, но действительно ли это необходимо для неизменяемости? Что не так с простой реализацией вроде этого (очень грубый черновик написал через 1 минуту)?
var store = { items: [] };
export function getState() {
return store;
}
export function addTodo(text) {
store.items.push({ "text": text, "completed", false});
}
export function completeTodo(index) {
store.items[index].completed = true;
}
Он по-прежнему является глобальным деревом состояний, мутированным с помощью действий, испускаемых, но чрезвычайно простых и эффективных.