Обновление двух объектов массива состояний одновременно в React

#javascript #reactjs

Вопрос:

Вот объекты массива состояний:

  const [items, setItems] = useState([
   {
    id: 1,
    completed: true
   },
   {
    key: 2,
    complete: true
   },
   {
    key: 3,
    complete: true
   }
    ])
 

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

   const [items, setItems] = useState([
   {
    id: 1,
    completed: true
   },
   {
    key: 2,
    complete: true
   },
   {
    key: 3,
    complete: false
   },
   {
    key: 4,
    complete: true
   }
    ])
 

Я понимаю, как добавить новый объект:

   const handleSubmit = e => {
    setItems([
      ...items,
      {
        key: 4,
        complete: true
      },
    ]);
  }
 

Но, как я уже упоминал выше, возможно ли обновить предыдущий объект также с помощью одной отправки? Заранее спасибо!

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

1. Подготовьте новый объект, а затем передайте его setItems() .

Ответ №1:

 function updateItems(newItem, completedId){
    setItems(prevItems =>{
        const result = prevItems.map(item =>{
            if(item.id !== completedId) 
                return item

            return {...item, complete : true}
        })

        return result.concat(newItem)
    })
}
 

Чтобы массив идентификаторов был проверен как полный, вы могли бы сделать

if(completedIds.includes(item.id)

Ответ №2:

возможно, вы можете использовать это, скопировать состояние, а затем выбрать последний завершенный объект и изменить его. после этого вы можете установить элементы()

 const handleSubmit = e => {
     const tempItems = [...items];
     tempItems[items.length - 1].complete = false;
     setItems([...tempItems,{key: 4,complete: true}]);
}
 

вместо написания ключа вручную

 setItems([...tempItems, {key:items.length   1, complete:true}])