动态表单的核心是name语义一致性而非元素增删,必须统一用name="items[]"等空数组语法,避免显式编号或混用点号/方括号,删除需移除完整DOM节点,新增不拼索引,确保后端接收结构化、无缺失的数组数据。

动态表单的核心不是“怎么加元素”,而是“怎么让 name 语义不崩”。只要 name 写对,浏览器自动聚合成数组,后端开箱即用;写错索引或混用结构,删一项就丢数据。
name 属性必须用 [],别手动编号
显式写 name="items[0]"、name="items[1]" 看似清晰,但 JS 删除中间项后,DOM 上的 name 不会自动重排,后端收到的就是稀疏数组(比如只有 items[0] 和 items[2]),部分框架(如 Express 默认配置)直接忽略缺失索引,导致数据丢失。
- ✅ 正确:统一用
name="items[]",靠 DOM 节点顺序决定提交顺序 - ✅ 结构化字段也用空键:
name="files[][name]"、name="files[][size]",后端解析时自动补序号 - ❌ 避免:
name="items[0].name"—— 点号是后端框架解析的,浏览器原生不认 - ❌ 避免:
name="meta[key1]"和name="items[0]"混用 —— 解析结果类型不一致,PHP 可能转成对象+数组混合体
删除表单项必须移除整个 DOM 节点,不能只清空 value
只设 input.value = "" 或 input.remove() 却没删父容器,会导致:表单提交时仍带空值、FormData 里残留字段、JS 逻辑误判“该项还存在”。
- ✅ 删前确认:
if (confirm("确定删除?")) { item.parentNode.removeChild(item); } - ✅ 容器要包裹完整一项:
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











