обработка ошибки при попытке установить ключ неизменяемого и замороженного объекта

#react-native

Вопрос:

у меня есть следующий объект в состоянии:

App.js

 const data = {name: 'John', status:'employeed' };  const [manager, updateManager] = useState(data);   const updateStatus = async () =gt;{  await service.setStatus(manager);    }  

setStatus напрямую изменяет менеджер, что, я думаю, является источником проблемы

service.js

 setStatus(manager){  manager.status = 'employeed';  }  

поэтому я изменил вызов, чтобы отправить копию объекта диспетчера и вернуть новый объект, но все равно получаю ошибку

 you tried to modify 'status' key of an immutable object.  

вот мое новое изменение

App.js

 const updateStatus = async () =gt;{  const g = await service.setStatus({...manager});  updateManager(g);  }  

service.js

 setStatus(manager){  manager.status = 'employeed';  return manager;  }     

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

1. Вы все еще напрямую изменяете состояние. setStatus(manager) { return {...manager, status: 'employeed'}; } это то, как вы сделали бы это, не меняя оригинал. (Обратите внимание, что «занят» — это то, как вы бы написали статус трудоустройства на английском языке.)

Ответ №1:

Почему эта функция должна быть асинхронной?

 const updateStatus = async () =gt;{  await service.setStatus(manager); }  

Это вернет новый/обновленный объект, но не внесет никаких постоянных изменений.

 setStatus(manager){  return {…manager,status: 'employeed'};  }  

Сохраняется ли проблема после ваших последних изменений?

Вы должны передать обратный вызов, как это:

 const updateStatus = (manager) =gt; {  service.setStatus(()=gt; updateManager({  ...manager,  status: 'employeed'  }));    

Service.js

 setStatus(updateManager){  updateManager(manager);  }  

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

1. setStatus-это обещание, поэтому пришлось выполнять его асинхронно. Да, после внесения изменений ошибка все еще сохраняется, заставляя меня задуматься, действительно ли я отправляю копию объекта.

2. setStatus должен быть асинхронным, но в вашем примере это совсем не обязательно.