Разве 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 59

1 ответ:

разве Redux не просто прославил глобальное государство?

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

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

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

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

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