Если у меня есть состояние массива React, созданное с помощью хука useState, можно ли как-то узнать, какие элементы были обновлены? Мое намерение состоит в том, чтобы запускать некоторый код всякий раз, когда состояние обновляется внутри хука useEffect, но я хотел бы иметь доступ к индексу(ам) обновленных элементов массива. Это возможно?

0
christian_js 25 Ноя 2022 в 21:40
Не могли бы вы добавить код?
 – 
RubenSmn
25 Ноя 2022 в 21:45
1
Наверняка вы сами обновили состояние, так что у вас уже есть эта информация.
 – 
Roberto Zvjerković
25 Ноя 2022 в 21:45
Я хотел бы запустить этот код в хуке useEffect после обновления состояния. Извините, что не упомянул об этом.
 – 
christian_js
25 Ноя 2022 в 21:47
Я понимаю, но зачем тебе вообще нужен этот крючок? Где вообще произошло обновление? Кажется естественным «запустить некоторый код», когда происходит обновление, и у вас есть вся информация, вместо того, чтобы делать это в следующем цикле рендеринга?
 – 
Roberto Zvjerković
25 Ноя 2022 в 21:50

2 ответа

Лучший ответ

Да можно, но если индексы не меняются.

Вы можете удерживать свое предыдущее состояние и в своем useEffect перебирать новый массив и проверять, равен ли элемент с индексом i соответствующему элементу в предыдущем состоянии или нет:

const [myArray, setMyArray] = useState([]);
const [myPreviousArray, setMyPreviousArray] = useState([]);

// Assume we have a function that updates the state
const handleArrayDataChange = (newValue) => {
  setMyPreviousArray([...myArray]);
  setMyArray(newValue);
}

useEffect(() => {
  myArray.forEach((item, index) => {
   if(JSON.stringify(item) !== JSON.stringify(myPreviousArray[index])) {
    // The item is updated
   }
  });
}, [myArray]);
1
Amirhossein 25 Ноя 2022 в 21:48

Мое намерение состоит в том, чтобы запускать некоторый код всякий раз, когда состояние обновляется внутри хука useEffect,

Это можно сделать, передав состояние в массиве зависимостей useEffect.

const [nameArray, setNameArray] = useState([]);

useEffect(() => {
// things you want to do
},[nameArray]);
-2
Abhishek Chandrasenan 25 Ноя 2022 в 21:53