Мне немного неясно, как React обрабатывает состояние обновления с помощью useReducer.
У меня есть эти биты кода, как показано ниже:
function userSelectionsReducer(state, action) {
switch (action.type) {
case 'editQtt':
state[action.data.index].quantity = action.data.value;
return state;
break;
case 'editDate':
return state.map((item, index) =>
index == action.data.index ?
{ ...item, deliveryDate: action.data.value} :
item
);
break;
}
}
const [userSelections, dispatchUserSelection] = useReducer(userSelectionsReducer, {});
useEffect(() => {
console.log(userSelections) //will reach here with 'editDate' but not 'editQtt'
}, [userSelections])
const logState = () => {
console.log(userSelections) //will log new value of 'state' after dispatching 'editQtt'
}
....
<button onClick={logState}>Log selections</button>
Как видите, первое действие Я пишу это так, что значение 'state' будет обновляться напрямую, а в другом я возвращаю новый экземпляр состояния с обновленным значением. Из того, что я знаю (не совсем уверен), «состояние» является неизменным и не может быть изменено напрямую, но, как я заметил с первым действием, значение «состояния» фактически изменяется, но не вызывает повторного рендеринга компонента или вызовите функцию обратного вызова useEffect. Но когда я вручную регистрирую его с помощью специальной кнопки, он показывает обновленное значение. Ребята, вы знаете, как это работает? Спасибо!