React UseEffect删除数组元素后未触发页面更新问题求助
问题根因
- 删除用户操作成功后,你没有更新全局存储的
githubUserData状态,也没有触发重新拉取最新的已保存用户列表,所以页面不会自动刷新。 - Profile组件里的useEffect依赖只有
setGithubUserData,这个是React的状态更新函数,引用稳定不会变化,所以只会在组件挂载时执行一次,后续操作不会触发重新拉取数据。
修复方案
1. 修改DeleteButton组件,删除成功后同步更新全局状态
在删除接口调用成功后,直接过滤全局状态里已删除的用户条目即可,无需额外发请求拉取全量数据:
// DeleteButton.jsx 完整修改后代码 import React, { useContext } from 'react'; import { Button } from 'react-bootstrap'; import axios from 'axios'; import swal from 'sweetalert'; import { AppContext } from '../context/AppContext'; // 引入全局上下文 const DeleteButton = ({ githubUserDataLogin, githubUserDataId }) => { // 从上下文拿到状态更新方法 const { setGithubUserData } = useContext(AppContext); const handleRemove = async () => { try { // 给Github接口的请求加await,避免接口失败还更新本地状态 await fetch(`https://api.github.com/user/following/${githubUserDataLogin}`, { method: 'DELETE', headers: { Authorization: `token ${process.env.GITHUB_TOKEN}` } }); await axios({ method: 'DELETE', url: `/api/githubdata/${githubUserDataId}`, withCredentials: true }); // 重点:更新全局状态,过滤掉已删除的用户 setGithubUserData(prev => prev.filter(user => user._id !== githubUserDataId)); swal( '已从档案移除!', `你已经在Github上取关 ${githubUserDataLogin}`, 'success' ); } catch (err) { swal('错误', '操作失败,请稍后重试', 'error'); } }; return ( <Button variant="outline-danger" style={{ marginLeft: 20 }} onClick={handleRemove} id="saved-users-delete-button" > 移除用户 </Button> ); }; export default DeleteButton;
2. 可选优化:规范Profile组件的useEffect依赖(更稳妥)
如果你希望数据始终和后端完全对齐,可以修改Profile的useEffect依赖,增加登录用户标识作为触发条件,避免用户切换后数据还是上一个用户的:
// Profile.jsx 中useEffect修改后代码 // 先从上下文拿到currentUser const { githubUserData, setGithubUserData, currentUser } = useContext(AppContext); useEffect(() => { // 未登录时不发起请求 if(!currentUser) return; axios.get('/api/githubdata').then((res) => { setGithubUserData(res.data); }) .catch((err) => { if (err) { swal('错误', '拉取已保存用户失败', 'error'); } }); }, [setGithubUserData, currentUser]);
3. 额外bug修复
你当前代码里有两个小问题会影响功能,建议同步修改:
- SavedGithubUsersCard组件中Link跳转地址写死成了字符串,应该用变量:
// 错误写法 to={{ pathname: "githubUserData.html_url" }} // 正确写法 to={githubUserData.html_url} - map遍历的时候参数名和props名重复,会造成变量覆盖,建议修改:
// 错误写法 githubUserData?.map(githubUserData => ( // 正确写法 githubUserData?.map(user => ( // 后续里面的属性都改成user.xxx即可
内容的提问来源于stack exchange,提问作者J_3507
相关产品推荐
相关产品推荐

