正确做法是将 hidden 改为 type="text" + class="layui-hide" + readonly,使其被 form.val() 正常采集和重置;若必须用 hidden,则需手动管理其值,但 verify 不生效。

单选框 change 后怎么同步 hidden 字段值
直接用 document.getElementById().value = 或 layui.$().val() 写 hidden 的 value,表单提交时值是有的,但 form.val() 读不到,form.reset() 也清不掉——因为 Layui 默认跳过 type="hidden" 字段。
正确做法是:把 hidden 改成 type="text" + class="layui-hide" + readonly。这样它既视觉隐藏、不可编辑,又会被 form.val() 正常采集和重置。
- HTML 写法:
<input type="text" name="user_type" class="layui-hide" readonly> - 监听单选变化:
form.on('radio(userType)', function(data) { form.val('myForm', { user_type: data.value }); }); - 确保
form.val()第二个参数的 key 和 input 的name一致,否则写不进去
为什么不能用原生 hidden + 手动赋值
原生 input[type="hidden"] 在 Layui 表单体系里是“半托管”状态:提交时浏览器会带上,但 Layui 的 form.val()、form.verify()、form.reset() 全部忽略它——这是设计使然,不是 bug。
常见翻车点:
- 后台返回默认值后,你用
form.val('myForm', { user_type: 'admin' }),结果 hidden 没变,因为没被识别 - 用户切换单选框,你手动
$('#user_type').val('guest'),但form.val('myForm')仍返回空对象 - 点重置按钮,hidden 的值纹丝不动,导致下次提交带错旧值
如果必须保留 type="hidden" 怎么办
只能绕过 Layui 的自动采集链,改用显式管理:
- 提交前手动取值:
var hiddenVal = document.querySelector('input[name="user_type"]').value;,拼进 AJAX 请求体 - 初始化时手动设值:
document.querySelector('input[name="user_type"]').value = backendData.user_type; - 重置时手动清空:
document.querySelector('input[name="user_type"]').value = ''; - 注意:此时
form.verify()不会校验它,哪怕写了lay-verify="required"也无效
这种写法容易漏掉某处,尤其在多处操作该字段时,数据流向变得不透明。
关联逻辑里最容易被忽略的点
单选框的 data.value 是字符串,而 hidden 字段可能需要数字或 JSON 字符串。比如后端要的是 {"role":"admin"},但单选框只传了 "admin"。
别在 form.on('radio(xxx)') 回调里硬编码拼接,应该提前定义映射关系:
const hiddenMap = { admin: '{"role":"admin"}', guest: '{"role":"guest"}' };- 然后
form.val('myForm', { user_type: hiddenMap[data.value] || '' });
映射关系一旦复杂,就别塞进表单字段名里,直接用 data- 属性挂载原始数据,提交时再按需序列化。


















