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

Chakra Modal包裹Formik FieldArray时字段name与ID异常问题

问题根因

你遇到的问题本质是Modal复用逻辑错误:

  • 你在FieldArray的循环遍历中,给每一个locations数组项都渲染了一个独立的Modal组件
  • 所有Modal共用了同一个isOpen状态控制显隐,触发打开操作时所有循环生成的Modal会同时渲染
  • 最后一次遍历生成的Modal会层级覆盖前面所有Modal,因此你看到的表单永远是数组最后一项的字段配置

修复方案

你不需要为每一项单独生成Modal,仅保留一个全局公共Modal即可,通过状态记录当前操作的数组下标来绑定表单字段:

  1. 新增状态记录当前操作的数组下标
// 新增状态
const [activeLocationIndex, setActiveLocationIndex] = useState(null)
  1. 将Modal组件从FieldArray的循环中移除,放到表单外层的任意位置
  2. 修改打开Modal的触发逻辑,点击对应项的按钮时传入当前下标
const handleOpenModal = (e, index) => {
  setActiveLocationIndex(index)
  // 原有打开Modal的逻辑
  setIsOpen(true)
}

// 循环中的按钮调用时传入当前index
<Button
  // 其余属性不变
  onClick={(e) => handleOpenModal(e, index)}
>
  1. 修改Modal内表单的字段绑定逻辑,使用记录的activeLocationIndex替代循环的index
<Input
  name={`locations.${activeLocationIndex}.facebookUrl`}
  value={formik.values.locations[activeLocationIndex]?.facebookUrl ?? ''}
  // 其余属性不变
/>
  1. 关闭Modal时重置下标避免状态污染
const onClose = () => {
  setIsOpen(false)
  setActiveLocationIndex(null)
}

额外优化建议

  • 循环渲染的列表项key不要用Math.random()、id+1这类不稳定/易重复的值,优先用每条数据的唯一业务ID,无业务ID时再使用index加固定前缀作为key
  • 可以对activeLocationIndex做非空判断,避免Modal打开前取值报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:33:02