Само состояние избыточности не является неизменным , но оно состоит из неизменных структур данных. Сказать, что это состояние является неизменным, неправильно.
Смысл неизменности структуры данных в том, что вы никогда не изменяете ее. Говоря о массивах, мутирование означает добавление, удаление или установку значений (например, push
, shift
, splice
и т. Д.). Поэтому, чтобы изменить значение, вы всегда должны создавать новый массив (вместо изменения существующего массива).
Например:
const reducer = (state = [], action) => {
const addedValue = action.payload.addedValue;
return [...state, addedValue];
}
не
const reducer = (state = [], action) => {
const addedValue = action.payload.addedValue;
state.push(addedValue);
return state;
}
В этом смысле как предыдущее, так и новое состояние (возвращаемое значение) являются неизменными структурами данных.
Чтобы объяснить концепцию бегания во времени, упомянутую в комментариях, сначала предположим, что в некоторой переменной есть некоторое избыточное состояние:
let state = /* redux state */
При каждом запуске действия все редукторы запускаются рекурсивно для создания нового состояния. Вся концепция в Redux выражается примерно так:
let oldState = state;
state = reducers(oldState, action);
Концепция временного хода означает, что мы делаем что-то вроде этого:
const stateHistory = [];
stateHistory.push(state)
state = reducers(oldState, action);
Таким образом, наша переменная stateHistory
содержит полное предыдущее состояние. Чтобы пройти время, мы можем просто:
state = stateHistory[index];
и перерисовать.
Однако это не будет работать без неизменных структур данных. Неизменяемые структуры данных гарантируют, что все состояния в истории независимы, и одно изменяющееся не повлияет на остальные.