Вы можете передать функцию setClusters
, которая получает текущее состояние в качестве аргумента. Затем вы можете сравнить и либо вернуть новые элементы, если есть что-то новое, либо старое значение, если ничего не изменилось. React достаточно умен, чтобы знать, что он не должен перерисовываться, если вы установили состояние с точным тем же значением.
Но у вас есть другая проблема. React уже достаточно умен, чтобы не выполнять рендеринг, если ваше состояние не изменилось. Но ваше состояние меняется . Ваш вызов API создает новые объекты данных, которые не будут напрямую сопоставимы с вашими старыми.
Итак, вам нужно найти лучший способ обнаружить, если что-то изменилось. ===
или !==
не скажут, что у вас два массива имеют одинаковые элементы, они сообщат вам, если они являются одним и тем же точным экземпляром массива.
[1,2,3] === [1,2,3] //-> false
Таким образом, вы должны придумать способ сказать, если у вас есть два массива содержат одинаковое содержимое. Один из способов сделать это - создать строку идентификаторов из старых и новых данных, а затем сравнить их. (Предполагая, что clusters
является массивом объектов, на которых есть некоторые уникальные id
). Вы создаете одно значение, которое можно сравнить с другим единственным значением, чтобы увидеть, изменилось ли что-либо.
setClusters(prevClusters => {
const prevIds = prevClusters.map(member => member.id).sort().join('-')
const newIds = responseBody.members.map(member => member.id).sort().join('-')
if (newIds === prevIds) {
return prevClusters // nothing has changed, return previous value
} else {
return responseBody.members // return new values.
}
})