layui switch 的 value 值取自 input 元素的 value 属性(开时返回该值,关时固定返回空字符串),而非 checked 或表单初始值;其真实状态需通过 form.on('switch(filter)') 回调中的 data.value 获取,且关态永不返回 "0"。

layui switch 的 value 值到底取自哪里
layui 的 switch 组件本身不直接依赖表单 value 属性来决定初始状态,而是靠 checked 属性或 lay-swtich 的开关文本(如 "on|off")隐式推导。你用 form.val('filter') 拿不到它的真实值,因为它的“值”是运行时由 DOM 状态动态映射出来的,不是静态写死在 input 上的。
- 如果你没显式设置
value属性,switch默认开时返回"on",关时返回"off" - 如果你写了
value="1",那开时就是"1",关时会自动 fallback 到空字符串""(不是"0",这点很多人误判) -
lay-text="是|否"只影响显示文字,不影响提交值
监听 switch 变化并获取当前值的正确写法
不能只靠 change 事件监听原生 input,因为 layui 的 switch 是用 div 模拟的,真实触发的是 form.on('switch(filterName)')。
form.on('switch(statusFilter)', function(data){
console.log(data.elem); // DOM 元素
console.log(data.value); // 当前值,即 input 的 value(开时取 value,关时取 "")
console.log(data.elem.checked); // 原生 checked 状态,true/false
});
- 必须给
switch所在的form设置lay-filter="statusFilter" -
data.value是最稳妥的取值方式,它已按 layui 规则做了映射 - 不要读
$(data.elem).val()—— 它始终返回初始value,不会随开关变化更新
提交表单时怎么确保 switch 值被正确收集
layui 的 form.val('filter') 会自动把 switch 的当前状态转成对应值,但前提是:
-
switch必须是<input type="checkbox">,且有name属性 - 它必须包裹在设置了
lay-filter的<form>内 - 不要手动删掉或覆盖
name,否则form.val()直接忽略它
常见错误:
- 把
switch写成<input type="radio">或没写name→ 提交时完全丢失 - 用
form.val('filter', {status: '1'})初始化后,再点开关,form.val('filter')返回的仍是{status: '1'},不会自动同步 → 必须用监听回调实时取data.value - 服务端期望接收
0/1,但前端没做转换 → 建议在监听回调里统一转:const realVal = data.value ? 1 : 0;
为什么有时候 switch 显示状态和实际值对不上
本质是渲染时机与数据不同步。典型场景:
- 动态插入的 switch(比如 table 行内编辑),没调用
form.render('switch') - 用 JS 修改了
input的checked属性,但没触发 layui 的内部状态更新 - 多个同名
switch(如循环生成),但没加唯一name或没设lay-skin="switch"→ layui 只认第一个
修复方法:
- 动态添加后立刻执行
form.render('switch', 'yourFilter'); - JS 控制开关状态请用
form.val('filter', {name: 'on'});而非直接操作elem.checked - 确保每个
switch的name唯一,或用数组名如name="roles[]"并配合后端接收逻辑
layui 的 switch 值逻辑藏得有点深:它既不是纯 DOM 属性,也不是完全抽象的组件状态,而是在渲染、监听、提交三个环节分别走不同路径。最容易忽略的是——关状态永远不传 value,哪怕你写了 value="0",它也只认空字符串。


















