2015-10-29 3 views
53

Итак, я начал изучать 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; 
} 

Это все еще глобальное дерево состояний, мутированное посредством действий, испускаемых, но чрезвычайно простых и эффективных.

+1

«Во-первых, почему дерево состояния должно быть неизменным?» --- тогда вы должны предоставить алгоритм для определения того, изменились ли данные. Невозможно реализовать его для произвольной структуры данных (если она изменена). Возьмите 'immutablejs' и используйте' return state.setIn ([action.index, 'completed'], true); 'для уменьшения шаблона. – zerkms

+0

PS: 'return state.map (i => i.index == action.index? {... i, completed: true}: i);' – zerkms

ответ

32

Не является ли Redux просто прославленным глобальным государством?

Конечно, это так. Но то же самое относится к каждой базе данных, которую вы когда-либо использовали. Лучше рассматривать Redux как базу данных в памяти, от которой зависят ваши компоненты.

Неизменяемость позволяет проверить, было ли какое-либо поддерево изменено очень эффективно, поскольку оно упрощает проверку личности.

Да, ваша реализация эффективна, но весь виртуальный дом должен быть повторно отображен каждый раз, когда дерево каким-то образом управляется.

Если вы используете React, он в конечном итоге выполнит разницу с фактическим dom и выполнит минимальные оптимизированные по партии манипуляции, но полный рендеринг сверху вниз все еще неэффективен.

Для неизменяемого дерева компоненты без гражданства просто должны проверить, зависит ли их поддерево (-ы), идентичны ли они по сравнению с предыдущими значениями, и если это так - рендеринг можно полностью исключить.

+2

Разве это не слишком предвыборная оптимизация? Кроме того, как мы узнаем, что стоимость постоянного дублирования неизменяемых объектов меньше, чем повторная рендеринг DOM (также не будет ли React Virtual DOM сильно уменьшать эту стоимость?) –

+3

Ну, GUI библиотеки такого рода оптимизации в течение длительного времени (См. Http://bitquabit.com/post/the-more-things-change/). Кроме того, управление неизмененной структурой данных не так дорого, как вы могли бы подумать - например, если узел изменяется, только одна цепочка родители нуждаются в цепочке - остальная часть узлов остается незатронутой. Таким образом, мы не дублируем * целую * структуру данных для каждого действия - мы повторно используем подкомпоненты, которые не изменились для создания новой структуры данных. – lorefnon

+0

Как насчет моего массива мазков? Существует ли неизменный и эффективный способ дублирования этого массива из сотен элементов при простом добавлении одного элемента в конец массива? –

 Смежные вопросы

  • Нет связанных вопросов^_^