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

Ant Design <Select>结合react-hook-form与值转换时初始值不显示问题

问题原因分析

核心问题出在Ant Design Select的默认值匹配机制:

  • AntD Select 默认使用严格相等(===)校验表单值与选项值是否匹配,你通过Zod转换生成的初始对象(比如{ value: 'a', label: 'Option A' }),和选项数组里的对象是不同引用,即便结构完全一致,也会匹配失败,导致初始值无法显示。
  • 原生<select>的匹配逻辑基于值的字符串内容(原生仅支持字符串/数字类型的value),纯字符串值的AntD Select也是直接比较字符串内容,所以这两种场景都能正常显示初始值。
解决方案

最直接的修复方式是给AntD Select添加compareWith属性,自定义值的匹配逻辑,通过对象的value字段判断是否相等,而非依赖引用:

<Select
  {...register("selectedOption")}
  options={options}
  compareWith={(a, b) => a?.value === b?.value}
/>

其他可选方案

  1. 复用选项对象引用:在Zod转换和表单初始化时,直接从选项数组中获取对应对象,而非创建新对象。比如修改Zod转换逻辑:
const optionSchema = z.string().transform((val) => options.find(opt => opt.value === val));

同时表单默认值直接使用options里的对象:

defaultValues: { selectedOption: options[0] }
  1. 保持表单值为字符串:如果业务允许,表单值仍存字符串,仅在渲染Select时通过选项映射显示,这种方式可以避开对象引用问题,但会失去Zod转换为对象的便利性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:05:21