实现 React 级联选择下拉框
· 阅读需 4 分钟
TL;DR
级联选择的核心是:父级变化时,必须重置子级为有效值。使用 Record<string, Option[]> 类型映射数据,在 onValueChange 回调中同步更新子级状态。
问题现象
实现 Provider → Model 级联选择时,切换 Provider 后:
// 切换前:provider = "openai", model = "gpt-4o"
// 切换后:provider = "anthropic", model = "gpt-4o" ❌
// Model 下拉框显示为空,因为 "gpt-4o" 不在 anthropic 的模型列表中
<Select value={model}> // model 值不在 options 中,显示空白
或者提交表单时,Model 值是上一个 Provider 的模型,导致后端验证失败。
根因
React 受控组件的 value 必须存在于 options 中。当 Provider 变化时,Model 的 options 列表更新了,但 model state 仍保留旧值。如果旧值不在新的 options 中,Select 组件会显示为空。
关键问题:只更新了 options 数据,没有同步更新 state 值。