Сначала найдите в текущем состоянии любые существующие элементы данных, если они найдены, обновите его, в противном случае добавьте в массив.
Используя array :: findIndex
const messageHandler = data => {
const dataIndex = status.findIndex(
item => item.application === data.application
);
if (dataIndex !== -1) {
set_status(status =>
status.map(item => {
return item.application === data.application
? { ...item, status: data.status }
: item;
})
);
} else {
set_status(status => [...status, data]);
}
});
Использование array :: find
const messageHandler = data => {
const found = status.find(item => item.application === data.application);
if (found) {
set_status(status =>
status.map(item => {
return item.application === data.application
? { ...item, status: data.status }
: item;
})
);
} else {
set_status(status => [...status, data]);
}
});
Изменить: определить этот обратный вызов вне эффекта
useEffect(() => {
socket.on("message", messageHandler);
}, []);