Immer обновляет данные с помощью spread

#reactjs #immer.js

#reactjs #immer.js

Вопрос:

допустим, у меня есть состояние в redux

 const initialState = {
 age: 0,
 title: undefined,
 body: undefined,
 author: undefined
}
  

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

 const updateState = (state, newState) => {
 return {...state, ...newState}
}
  

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

Я наткнулся на Immer и до сих пор не могу понять, как сделать функцию updateState (не обновлять ключ по ключу вручную). Не могли бы вы показать мне, как это сделать?

Комментарии:

1. Можете ли вы рассказать немного больше о том, чего вы хотите достичь, возможно, используя пример объекта и ожидаемый результат? Будет высоко оценена изолированная среда кода с текущим прогрессом.

Ответ №1:

 const updateState = produce((draft, action) => {
 Object.assign(draft, action);
})
  

или

 const updateState = produce((draft, action) => {
 return {...draft, ...action}
})
  

В любом случае идея immer заключается в том, чтобы либо вернуть новое состояние, либо напрямую изменить черновик объекта, но никогда оба.

Комментарии:

1. Добро пожаловать в Stack Overflow. Было бы полезно, если бы вы могли объяснить, почему ваш код решит проблему.

2. Сегодня возникла эта проблема! Объяснение заключается в том, что вам нужно изменить черновик объекта Object.assign , чтобы Immer понял, что объект был изменен.