You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 17:48:01