HOW - 用户在前端页面长时间停留数据状态一致性保持方案
目录
- 方案 1:轮询数据刷新
- 方案 2:操作前二次校验
- 方案 3:WebSocket 实时更新
- 最终方案推荐
如果用户长时间停留在页面上,某些数据状态在后台已更新,而前端页面仍显示旧状态,此时提交操作可能会出错。为了解决这个问题,可以采用以下几种优化方案:
方案 1:轮询数据刷新
-
每隔一段时间(比如 30s)重新拉取数据,保证状态与后端同步。
-
使用
useSWR
或setInterval
定期触发数据刷新。const { data, mutate } = useSWR('/api/items', fetcher, { refreshInterval: 30000 });
方案 2:操作前二次校验
-
操作前 先请求一次最新状态,并与当前状态对比,如果不匹配,则提示用户刷新数据。
const handleUpdateStatus = async (id: string, newStatus: Status) => { const latestItem = await fetch(`/api/item/${id}`).then(res => res.json()); if (latestItem.status !== currentItem.status) { message.warning("状态已变更,请刷新后重试!"); mutate(); // 触发数据刷新 return; } await updateStatusAPI(id, newStatus); mutate(); };
方案 3:WebSocket 实时更新
-
使用 WebSocket 监听后端推送的状态变化,实时更新前端数据。
useEffect(() => { const ws = new WebSocket("wss://your-api.com/status-updates"); ws.onmessage = (event) => { const updatedItem = JSON.parse(event.data); mutate(); // 触发数据刷新 }; return () => ws.close(); }, []);
最终方案推荐
如果数据变更不频繁,可选 方案 1 + 方案 2;
如果是高频数据变更,建议采用 方案 3(WebSocket),实现更高效的实时同步。
这样能确保:
- 按钮的可用状态受状态流转规则限制,避免误操作。
- 用户长时间停留时,数据能保持较新,防止提交无效操作。
这种方式可以兼顾用户体验和数据一致性。