Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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