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

React调用删除API后组件未实时移除需刷新才生效如何解决?

实现方案

项目列表的状态存储在父组件Dashboard中,只需要通过props将更新列表的回调方法传递给子组件ProjectItem,子组件删除成功后调用该回调更新父组件状态,即可实现页面自动刷新。

步骤1:修改Dashboard组件

新增删除成功后的更新逻辑,将回调方法传递给子组件:

import React, { useEffect, useState } from 'react'
import { Link } from 'react-router-dom'
import BackendService from '../services/BackendService'
import AppNavbar from './AppNavbar'
import ProjectItem from './ProjectItem'

const Dashboard = () => {
  // 注意:你当前命名为project实际存储的是项目列表,可根据实际接口返回值调整命名
  const [project, setProject] = useState({
    projectName: "",
    projectIdentifier: "",
    description: "",
  });

  useEffect(() => {
    BackendService.getProjects().then((res) => {
      setProject(res.data);
    });
  }, []);

  // 新增:删除项目后更新列表的回调方法,两种实现二选一即可
  const handleProjectDelete = (deletedId) => {
    // 实现1:本地过滤删除对应项,性能更高
    const filteredProjects = Object.values(project).filter(prj => prj.projectIdentifier !== deletedId);
    setProject(filteredProjects);

    // 实现2:重新拉取全量项目数据,保证和后端数据完全一致,更稳妥
    // BackendService.getProjects().then(res => setProject(res.data))
  }

  return (
    <div className="projects">
      <AppNavbar />
      <div className="container">
        <div className="row">
          <div className="col-md-12">
            <h1 className="display-4 text-center">Projects</h1>

            <Link to="/addProject">
              <button className="btn btn-warning">Create Project</button>
            </Link>

            {project &&
              Object.values(project).map((prj) => {
                return (
                  <div key={prj.id}>
                    {/* 新增传递onDelete回调 */}
                    <ProjectItem  
                        projectName={prj.projectName} 
                        projectIdentifier={prj.projectIdentifier}
                        description={prj.description}
                        onDelete={handleProjectDelete}
                    />
                  </div>
                );
              })}

            <hr />
          </div>
        </div>
      </div>
    </div>
  );
};

export default Dashboard

步骤2:修改ProjectItem组件

接收父组件传递的回调,删除接口调用成功后触发回调更新列表:

import React from 'react'
import BackendService from '../services/BackendService';
import { Link } from 'react-router-dom';

// 新增接收onDelete参数
const ProjectItem = ({projectName, projectIdentifier, description, onDelete}) => {

  const onDeleteClick = (id) => {
    if (window.confirm("Are you sure you want to delete this project?")) {
      BackendService.deleteProject(id)
        .then(() => {
          // 注意:原代码alert放在then外会出现删除失败还提示成功的问题,移到then内
          alert(`Project with ID ${id} was deleted successfully`);
          // 调用父组件回调更新列表
          onDelete(id);
        })
        .catch((err) => {
          console.log(err.response);
          alert("删除失败,请稍后重试");
        });
    }

  };

  return (
    <div className="container">
      <div className="card card-body bg-light mb-3">
        <div className="row">
          <div className="col-2">
            <span className="mx-auto">{projectIdentifier}</span>
          </div>

          <div className="col-lg-6 col-md-4 col-8">
            <h3>{projectName}</h3>
            <p>{description}</p>
          </div>

          <div className="col-md-4 d-none d-lg-block">
            <ul className="list-group">
              <Link to="">
                <li className="list-group-item update">
                  <i className="fa fa-edit pr-1"> Update Project Info</i>
                </li>
              </Link>

              <button
                className="list-group-item delete"
                onClick={() => onDeleteClick(projectIdentifier)}
              >
                <i className="fa fa-minus-circle pr-1"> Delete Project</i>
              </button>
            </ul>
          </div>
        </div>
      </div>
    </div>
  );
};

export default ProjectItem;

额外优化点:你的原代码中ProjectItem引入了useEffect、useState、useParams但都没有使用,可以直接删掉无用导入。


内容的提问来源于stack exchange,提问作者ServletException

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:24:03