React单页CRUD应用切出页面再返回后数据未更新问题求助
React单页CRUD应用切出页面再返回后数据未更新问题求助
嘿,我看了你的问题描述和代码,这个问题大概率是浏览器的**页面缓存(BF Cache,即后退/前进缓存)**或者页面休眠机制导致的。当你切换到其他页面再返回时,浏览器会直接恢复之前页面的快照,而不是让组件重新挂载,所以你那个只在挂载时执行一次的useEffect(() => loadApi(), [])不会重新触发,导致页面显示的还是初始加载的数据,而不是你更新后的最新数据。
下面给你针对性的解决方案,同时还发现你代码里有个小坑,一起帮你修正:
1. 添加页面可见性/恢复事件监听,主动刷新数据
你需要在Context组件里监听页面的visibilitychange和pageshow事件,当页面从后台回到前台或者从缓存中恢复时,重新调用API加载最新数据。修改你的Context里的useEffect:
useEffect(() => { // 封装loadApi为异步函数 const loadApi = async () => { const response = await fetch("http://localhost:8000/get-names"); const data = await response.json(); setItems(data); console.log(data); }; // 初始加载数据 loadApi(); // 页面变为可见时刷新数据 const handlePageVisible = () => { if (document.visibilityState === "visible") { loadApi(); } }; // 页面从BF Cache恢复时刷新数据 const handlePageShow = (e) => { if (e.persisted) { loadApi(); } }; // 添加事件监听 document.addEventListener("visibilitychange", handlePageVisible); window.addEventListener("pageshow", handlePageShow); // 组件卸载时移除监听,避免内存泄漏 return () => { document.removeEventListener("visibilitychange", handlePageVisible); window.removeEventListener("pageshow", handlePageShow); }; }, []);
2. 修正editItem中的状态更新问题
你的editItem函数里直接修改了数组元素的属性,这违反了React状态的不可变性原则,可能导致组件无法正确触发重新渲染。把map里的逻辑改成创建新对象:
const editItem = async (name: string, item: ItemType) => { const response = await fetch("http://localhost:8000/update-name",{ method: 'PUT', body: JSON.stringify({ id: item.id, name: item.name, newName: name, }), headers: {"content-type": "application/json"} }); const data = await response.json(); // 改成不可变更新,创建新对象而非修改原元素 const newArray = items?.map(el => { return el.id === item.id ? { ...el, name } : el; }); setItems(newArray); };
这样修改后,当你切出页面再返回时,页面会自动重新拉取最新的API数据,同时edit操作也能正确更新状态了。
备注:内容来源于stack exchange,提问作者Henrique Bandeira
相关产品推荐
相关产品推荐

