在中,我从api调用setState。然后,我创建一个EventSource,它将在每次收到事件时更新状态。
问题是,在EventSource回调中,状态没有更新。
我的猜测是,状态是在创建回调时打印出来的,因此不能更新。
还有别的办法吗?
function HomePage() {
const [rooms, setRooms] = useState<Room[]>([]);
const getRooms = async () => {
const data = await RoomService.getAll(currentPage);
setRooms(data.rooms);
}
const updateRooms = (data: AddRoomPayload | DeleteRoomPayload) => {
console.log(rooms); // rooms is always empty
// will append or remove a room via setRooms but i need actual rooms first
}
useEffect(() => {
// setState from api response
getRooms();
// set up EventSource
const url = new URL(process.env.REACT_APP_SSE_BASE_URL ?? '');
url.searchParams.append('topic', '/room');
const eventSource = new EventSource(url);
eventSource.onmessage = e => updateRooms(JSON.parse(e.data));
}, [])
...
}
发布于 2022-08-09 17:36:54
在使用setRooms
时,尝试使用如下功能更新:
const updateRooms = (data: AddRoomPayload | DeleteRoomPayload) => {
setRooms((rooms) => {
if (data.type === 'add') {
return [...rooms, data.room];
} else if (data.type === 'remove') {
return rooms.filter(/* ... */);
}
});
}
下面是对useState
:https://reactjs.org/docs/hooks-reference.html#functional-updates中功能更新的React的引用
如果这不起作用,那么试着检查React开发工具,以确保组件的状态rooms
正在更新。
https://stackoverflow.com/questions/73299518
复制相似问题