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

Почему объекты в Redux должны быть неизменными?

Почему объекты в Redux должны быть неизменными? Я знаю, что некоторые фреймворки, такие как Angular2, будут использовать onPush и могут использовать неизменность для сравнения состояний представлений для более быстрого рендеринга, но мне интересно, есть ли другие причины, поскольку Redux является агностиком среды, и все же он упоминает в своих собственных документах использовать неизменяемость (независимо от структуры).

Оцените любую обратную связь.

4b9b3361

Ответ 1

Redux - небольшая библиотека, которая представляет состояние как (неизменяемые) объекты. И новые состояния путем передачи текущего состояния через чистые функции для создания совершенно новых состояний объекта/приложения.

Если ваши глаза застеклены там, не волнуйтесь. Подводя итог, Redux не представляет изменения в состоянии вашего приложения, изменяя объекты (как и с объектно-ориентированными парадигмами). Вместо этого изменения состояния представлены как разность между входным объектом и выходным объектом (var output = reducer(input)). Если вы мутируете либо input, либо output, вы аннулируете состояние.

Подводя итог другому пути, неизменность является требованием Redux, поскольку Redux представляет ваше состояние приложения как "снимки замороженных объектов". С помощью этих дискретных снимков вы можете сохранить свое состояние или наоборот, и, как правило, более "учет" для всех изменений состояния.

Состояние вашего приложения изменяется только категорией чистых функций, называемых редукторами. Редукторы имеют 2 важных свойства:

  • Они никогда не мутируют, возвращая вновь построенные объекты: это позволяет рассуждать о вводе + выходе без побочных эффектов
  • Их подпись всегда function name(state, action) {}, поэтому она упрощает их компоновку:

Предположим, что состояние выглядит следующим образом:

    var theState = {
      _2ndLevel: {
        count: 0
      }
    }

Мы хотим увеличить счетчик, поэтому делаем эти редукторы

const INCR_2ND_LEVEL_COUNT = 'incr2NdLevelCount';

function _2ndlevel (state, action) {
    switch (action.type) {
        case INCR_2ND_LEVEL_COUNT:
            var newState = Objectd.assign({}, state);
            newState.count++
            return newState;
        }
    }

function topLevel (state, action) {
    switch (action.type) {
        case INCR_2ND_LEVEL_COUNT:
            return Objectd.assign({}, {_2ndLevel: _2ndlevel(state._2ndlevel)});
    }
}

Обратите внимание на использование Objectd.assign({}, ...) для создания абсолютно новых объектов в каждом редукторе:

Предполагая, что мы подключили Redux к этим редукторам, тогда, если мы используем систему событий Redux, чтобы вызвать изменение состояния...

    dispatch({type: INCR_2ND_LEVEL_COUNT})

... Redux вызовет:

    theNewState = topLevel(theState, action);

ПРИМЕЧАНИЕ: action - от dispatch()

Теперь theNewState - совершенно новый объект.

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

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

Ответ 2

В документации Redux упоминаются следующие преимущества неизменности: