В качестве практического упражнения я пишу приложение с калькулятором реактивного-редукса. Состояние моего приложения определяется как:
const initialState = {
operator1: "", //first operand
operator2: "", //second operand
currentOp: "", // +, -, *, /
display:"", //the current calculator display
currentOperator:1 //which operand is being entered right now
}
currentOp содержит символ операции, выполняемой в данный момент калькулятором, который при вводе первого операнда является пустым. Поэтому, когда номера моего калькулятора нажаты, мне нужно обновить отображение, но не теряя другие мои свойства состояния. Я написал свой редуктор так:
import {NUMBER_PRESSED,OPERATION_PRESSED,EQUAL_PRESSED} from './actions';
const mainReducer = (state ={},action) =>
{
console.log("reducer called!");
console.log(action);
const newState = {};
//copy the operators to the new state. Only one will be changed. (Is this really necessary?)
newState.operator1 = state.operator1;
newState.operator2 = state.operator2;
switch(action.type)
{
case NUMBER_PRESSED:
if (state.currentOperator===1)
{
newState.operator1 = state.operator1 + action.payload;
newState.display= newState.operator1;
}
if(state.currentOperator===2)
{
newState.operator2 = state.operator2 + action.payload;
newState.display= newState.operator2;
}
//set the other properties of the state (Is this really necessary?)
newState.currentOperator = state.currentOperator;
newState.currentOp = state.currentOp;
console.log("The new state is:");
console.log(newState);
return newState;
case OPERATION_PRESSED:
break;
case EQUAL_PRESSED:
break;
default:
return state;
}
}
export default mainReducer;
Обратите внимание, что я еще не реализовал операции расчета, просто обновляю отображение. Если я изменю переменную состояния напрямую, компонент калькулятора не обновится. Понятно, и это ожидаемое поведение, объясненное в документах. Однако кажется, что мне нужно вручную скопировать все состояние в новую переменную, чтобы оно сохраняло следующее состояние (обратите внимание на комментарии «Действительно ли это необходимо?» В коде).
У меня нет проблем с копированием всего состояния приложения и возвращением совершенно нового объекта состояния, но что происходит в больших приложениях с огромными деревьями состояний? Как это удалось? Есть ли способ изменить только часть состояния в Redux?