Итак, я начал изучать React неделю назад, и я неизбежно столкнулся с проблемой состояния и как компоненты должны взаимодействовать с остальной частью приложения. Я искал вокруг, и 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;
}
Это все еще глобальное дерево состояний, мутированное посредством действий, испускаемых, но чрезвычайно простых и эффективных.
«Во-первых, почему дерево состояния должно быть неизменным?» --- тогда вы должны предоставить алгоритм для определения того, изменились ли данные. Невозможно реализовать его для произвольной структуры данных (если она изменена). Возьмите 'immutablejs' и используйте' return state.setIn ([action.index, 'completed'], true); 'для уменьшения шаблона. – zerkms
PS: 'return state.map (i => i.index == action.index? {... i, completed: true}: i);' – zerkms