Layui表单中name带[]的字段需用form.getData()获取,配合traditional:true才能正确提交数组;否则data.field会覆盖重复name,后端无法解析为数组。
layui表单提交时 name 带 [] 的字段会被忽略
默认情况下,layui 的 form.val() 或监听 submit 事件拿到的 data.field 不会自动识别 name="roles[]" 这类带中括号的字段——它只把 name 当字符串处理,遇到重复名就覆盖,根本不会聚合成数组。
form.getData() 是唯一能原生支持 [] 的方法
官方未公开但实际存在于 form.js 中的 getData 方法,是专门用来处理数组名和多选字段的。它会:
- 扫描所有
input[name],识别形如hobby[]、option[0].value的命名 - 对同名 checkbox/radio 自动收集为数组(不是覆盖)
- 对带数字索引的嵌套名(如
user[0].name)保留原始结构
用法很简单:
layui.use(['form', 'jquery'], function(){
var form = layui.form;
var $ = layui.jquery;
// 必须给 form 加 lay-filter
form.on('submit(demo)', function(data){
// ❌ 错误:data.field 不支持 []
// ✅ 正确:用 getData 拿结构化数据
var field = form.getData('demo');
console.log(field.hobby); // ['1', '2'] 而不是 '2'
$.ajax({
url: '/api/save',
type: 'POST',
data: field,
traditional: true, // 关键!防止 jQuery 把数组转成 hobby[0]=1&hobby[1]=2
success: function(res){ ... }
});
return false;
});
});
不加 traditional: true 会导致后端收不到数组
即使前端用 getData 拿到了正确数组,如果 AJAX 请求没设 traditional: true,jQuery 默认会把 {hobby: ['1','2']} 序列化成 hobby[0]=1&hobby[1]=2,后端框架(如 Spring MVC、ThinkPHP)可能无法自动映射为数组,而变成空或单值。
- Spring Boot 需要接收参数为
@RequestParam String[] hobby或@RequestBody配合 JSON - PHP 的
$_POST['hobby']在传统模式下才是数组;否则是$_POST['hobby[0]']这种散键 - Node.js(如 Express)需配合
body-parser的extended: true才能解析嵌套键
自定义 name 规则时要注意索引连续性
像 option[0].value、option[2].value 这种跳过索引的写法,getData 仍能收集,但后端反序列化容易出错(比如 Java 的 List<option></option> 可能因缺 [1] 导致下标越界或截断)。
- 推荐用
option[]让前端自动编号,或服务端统一按顺序重排 - 避免混用
user[]和user[3]——getData会把它们当两个字段处理 - 如果必须用数字索引,确保从
0开始且连续,否则后端框架解析行为不可控
真正麻烦的不是怎么写 [],而是前后端对“数组名”的理解是否一致;哪怕前端拼对了,后端没配好解析器,照样收不到数组。


















