#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 понял, что объект был изменен.