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

如何在StudentCreate组件提交后无刷新重新挂载ListStudent组件并更新数据?

实现StudentCreateComponent提交后ListStudentComponent自动刷新数据

因为两个组件都是Home.js的子组件,要实现提交表单后列表无需刷新页面就重新获取数据,最直接的方式是把数据刷新逻辑提升到父组件,通过父组件传递回调函数和状态来同步两个子组件的行为。

步骤1:在Home.js中管理数据状态和刷新函数

在父组件Home.js里定义学生列表状态,以及获取数据的函数,然后把这些传递给对应的子组件:

import { useState, useEffect } from 'react';
import StudentCreateComponent from './StudentCreateComponent';
import ListStudentComponent from './ListStudentComponent';
import axios from 'axios';

function Home() {
  const [students, setStudents] = useState([]);

  // 定义获取学生数据的函数
  const fetchStudents = () => {
    axios.get("http://localhost:8000/api/")
      .then((response) => setStudents(response.data));
  };

  // 组件挂载时先获取一次数据
  useEffect(() => {
    fetchStudents();
  }, []);

  return (
    <div>
      <StudentCreateComponent fetchStudents={fetchStudents} />
      <ListStudentComponent students={students} />
    </div>
  );
}

export default Home;

步骤2:修改StudentCreateComponent的提交函数

在提交表单并成功发送POST请求后,调用父组件传来的fetchStudents函数,触发列表数据刷新:

const handleSubmit = (e) => {
  e.preventDefault();
  axios
    .post("http://localhost:8000/api/", data)
    .then((response) => {
      console.log(response.data);
      // 调用父组件的刷新函数,触发列表重新获取数据
      props.fetchStudents();
    })
    .catch((error) => {
      console.error("提交失败:", error);
    });
};

步骤3:调整ListStudentComponent使用父组件传递的状态

现在可以直接使用父组件传来的students状态渲染,不需要自己在组件内发起请求,逻辑更简洁:

// ListStudentComponent.jsx
function ListStudentComponent({ students }) {
  return (
    <div>
      {students.map(student => (
        // 根据实际数据结构渲染学生内容
        <div key={student.id}>
          <p>姓名:{student.name}</p>
          <p>学号:{student.studentId}</p>
        </div>
      ))}
    </div>
  );
}

export default ListStudentComponent;

如果坚持要在ListStudentComponent内部发起请求,也可以让父组件传递一个refreshKey,每次提交后父组件更新这个key,触发子组件的useEffect重新执行:

// Home.js中添加refreshKey状态
const [refreshKey, setRefreshKey] = useState(0);

// 修改刷新逻辑为更新key
const handleRefresh = () => {
  setRefreshKey(prev => prev + 1);
};

// 传递给两个子组件
<StudentCreateComponent handleRefresh={handleRefresh} />
<ListStudentComponent refreshKey={refreshKey} />

// ListStudentComponent.jsx内部
useEffect(() => {
  axios.get("http://localhost:8000/api/")
    .then((response) => setStudents(response.data));
}, [refreshKey]); // 依赖refreshKey,key变化时重新请求数据

两种方式都能实现提交后列表自动刷新的效果,推荐第一种状态提升的方式,逻辑更清晰易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:30:22