
react 中 select 组件失去选中状态或需多次点击才生效,通常是因为未正确绑定受控值(value)和 onchange 事件,导致组件在重渲染时退回到非受控模式。
要让
你当前的代码中缺失了 value={difficulty},这会导致以下问题:
- 组件首次渲染时无初始值(difficulty 为 undefined),
- 当用户选择选项后,React 会尝试“接管”该输入,但因 value 缺失,触发警告(如 Warning: A component is changing an uncontrolled input to be controlled);
- 后续重渲染(例如点击其他表单字段触发父组件更新)会使 Select 重置为 placeholder 或空状态;
- 多次点击才能生效,本质是 React 在受控/非受控模式间反复切换造成的渲染不一致。
✅ 正确写法如下(关键修复已加注释):
import { EnumDifficulty } from "@/components/Utils/EnumDifficulty";
import { useState } from "react";
const [difficulty, setDifficulty] = useState(undefined); // 推荐显式类型
return (
Niveau
); ? 重要注意事项:
- 不要用 uuidv4() 作为 key:每次渲染生成新 ID,会强制销毁并重建所有
- 为 value 提供明确初始值:若允许“未选择”状态,可用 undefined 或空字符串,但需确保 placeholder 逻辑兼容;若必选,建议初始化为首个有效值(如 useState(EnumDifficulty[0]))。
-
类型安全增强(TypeScript 推荐):
const [difficulty, setDifficulty] = useState
(undefined); // 并将 EnumDifficulty 定义为 const enum 或类型别名,提升类型推导准确性
? 总结:React 表单元素(、










