Разве Redux не просто прославил глобальное государство?
Итак, я начал учиться реагировать неделю назад, и я неизбежно попал в проблему состояния и того, как компоненты должны взаимодействовать с остальной частью приложения. Я искал вокруг и 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;
}
Это все еще глобальное дерево состояний, мутированное с помощью действий, но чрезвычайно простое и эффективное.
1 ответ:
разве Redux не просто прославил глобальное государство?
конечно. Но то же самое относится к каждой базе данных, которую вы когда-либо использовали. Лучше рассматривать Redux как базу данных в памяти, от которой ваши компоненты могут реактивно зависеть.
неизменяемость позволяет проверить, было ли какое-либо поддерево изменено очень эффективно, потому что это упрощает проверку подлинности.
Да, ваша реализация эффективна, но весь виртуальный dom нужно будет перерисовывать каждый раз, когда дерево каким-то образом манипулируется.
Если вы используете React, он в конечном итоге выполнит diff против фактического dom и выполнит минимальные пакетные оптимизированные манипуляции, но полный рендеринг сверху вниз по-прежнему неэффективен.
для неизменяемого дерева компоненты без состояния просто должны проверить, зависит ли оно от поддерева(ов), отличаются ли идентификаторы по сравнению с предыдущими значениями, и если да, то рендеринга можно избежать полностью.