Dynamic Forms 动态表单字段

最后更新:2026-10-28

Dynamic Forms 动态表单字段

字段数量不定时,用 state 里的数组驱动渲染:每个字段存一条记录,增删就是增删数组元素,更新某一字段时按 id map 替换。配合稳定 key,React 能正确复用各行的输入框状态。

分组组件模式
类型模式

ℹ️ 说明 编辑器将 JSX 转译为 JavaScript 后在沙箱中渲染真实界面;组件自动挂载,无需手写 render 调用。

📝 语法

const [rows, setRows] = useState([{ id: 1, name: '' }])

setRows([...rows, { id: nextId(), name: '' }])              // 新增一行
setRows(rows.filter(r => r.id !== id))                      // 删除一行
setRows(rows.map(r => r.id === id ? { ...r, name: v } : r)) // 改一格

返回值:无返回值,作为编码模式使用。

▶ 示例

示例可直接运行:展开后自动渲染,编辑代码即时生效。

输出结果:

默认一行输入框;点「+ 添加一行」增加、点「删除」移除,各行输入互不影响,底部实时显示人数。

💡 要点

💡 提示 列表 key 用业务 id 而不是数组下标,否则删中间行时其余行的输入状态会错位。
ℹ️ 说明 更新数组要保持不可变:filter / map 返回新数组,React 才能感知变化并重渲染。
⚠️ 注意 表单内的「增删行」按钮记得写 type="button",否则会触发表单默认提交行为。
更多案例整理中,敬请期待。

📚 相关教程

❓ 常见问题

Q 删除一行后其他行输入值错乱?
A key 用了数组下标:删除后下标前移,React 把输入框复用给了错误的记录。改用稳定业务 id 作 key。
Q 每行数据要拆成多个 useState 吗?
A 不要。行数动态变化,用「一个数组 state + 按 id 不可变更新」最简单,Hook 数量也不能动态增减。
Q 新行的 id 用什么生成?
A Date.now()、自增计数器或 crypto.randomUUID() 都可以,只要在同一列表内保持唯一稳定。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏