Замените существующий объект в состоянии другим объектом с помощью react hooks usestate

#reactjs

#reactjs

Вопрос:

У меня есть следующий код, который должен проверять, существует ли объект в состоянии, и заменять его, а если нет, добавлять его в состояние. Пока добавление к состоянию работает корректно, но при замене объекта пользовательский интерфейс соответствующим образом не обновляется.

 const [roomData, setRoomData] = useState([]);
 .............
onSelectRoom={(room) => {
  let roomIndex = roomData.findIndex(
    (room) => room.roomId == item.id
  );
  roomData[roomIndex]
    ? (roomData[roomIndex] = room)
    : setRoomData([...roomData, room]);
  setRoomTotals([]);
}}
  

Ответ №1:

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

 const newState = [...roomData];
newState[roomIndex] = room;
setRoomData(newState);
  

или вы можете попробовать что-то вроде:

 roomData[roomIndex] ? setRoomData(roomData.map((data,i)=>{
  if(i === roomIndex){
    return room
  }
  return data;
}) : setRoomData([...roomData, room]);
  

Ответ №2:

Примечание : вам не разрешено изменять состояние напрямую .

Это должно сработать с помощью функционального программирования.

   const onSelectRoom = (room) => {
    setRoomData((prev) =>
      prev.find((r) => r.id === room.id)
        ? prev.map((r) => (r.id === room.id ? room : r))
        : prev.concat(room)
    );
  };