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

如何通过useState实现表单提交后替换为学生列表的条件渲染?

实现提交后用列表替换表单的方案

核心就是用条件渲染,通过一个状态变量控制表单和列表的显示切换,具体步骤如下:

1. 在父组件添加控制显示状态的变量

修改StudentListResult.jsx,新增一个状态showList,用来标记是否要显示列表(初始值为false,默认显示表单):

import React, { useState } from "react";
import StudentForm from "./StudentForm";
import StudentList from "./StudentList";

const StudentListResult = () => {
  const [newStudent, setNewStudent] = useState("");
  const [students, setStudentsList] = useState([]);
  // 新增状态:控制显示表单还是列表
  const [showList, setShowList] = useState(false);

  return (
    <div>
      {/* 条件渲染:未提交时显示表单,提交后显示列表 */}
      {!showList ? (
        <StudentForm
          newStudent={newStudent}
          setNewStudent={setNewStudent}
          students={students}
          setStudentsList={setStudentsList}
          setShowList={setShowList} // 把切换状态的方法传给表单组件
        />
      ) : (
        <StudentList students={students} setStudentsList={setStudentsList} />
      )}
    </div>
  );
};
export default StudentListResult;

2. 修改表单组件,提交后切换显示状态

注意你原代码里的组件名是StudentListForm,要和父组件import的StudentForm保持一致,建议文件名和组件名统一为StudentForm.jsx。修改后接收setShowList,在提交成功后调用它切换到列表显示:

import React from "react";
import { v4 as uuidv4 } from "uuid";

const StudentForm = ({
  newStudent,
  setNewStudent,
  students,
  setStudentsList,
  setShowList // 接收父组件传过来的状态切换方法
}) => {
  const addStudent = (event) => {
    event.preventDefault();
    // 校验输入,避免添加空名字
    if (!newStudent.trim()) return;
    setStudentsList([...students, { id: uuidv4(), name: newStudent.trim() }]);
    setNewStudent("");
    // 提交完成后,切换状态显示列表
    setShowList(true);
  };
  return (
    <form onSubmit={addStudent}>
      <div>
        <input
          value={newStudent}
          type="text"
          placeholder="Student Name"
          onChange={(e) => setNewStudent(e.target.value)}
        />
      </div>
      <div>
        <button>Submit</button>
      </div>
    </form>
  );
};

export default StudentForm;

3. (可选)给列表添加返回表单的功能

如果需要允许用户继续添加学生,可以在StudentList.jsx里加一个按钮,调用父组件的setShowList切换回表单:

先修改父组件,把setShowList传给StudentList:

// StudentListResult.jsx里的列表部分
<StudentList 
  students={students} 
  setStudentsList={setStudentsList}
  setShowList={setShowList} // 新增传递
/>

然后修改StudentList.jsx,同时修正原代码中每个学生单独渲染<ul>的HTML结构问题:

import React from "react";

const StudentList = ({ students = [], setShowList }) => {
  return (
    <div>
      <h3>学生列表</h3>
      <ul>
        {students.map((student) => (
          <li key={student.id}>
            <p>{student.name}</p>
          </li>
        ))}
      </ul>
      <button onClick={() => setShowList(false)}>添加新学生</button>
    </div>
  );
};
export default StudentList;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 03:11:50