单选框初始隐藏是因layui将原生radio设为display:none,靠js插入美化节点替代;必须加载form模块、dom就位后调用form.render(),且需确保name一致、title属性存在、无lay-ignore拦截。

直接调用 form.render() 就能显示,前提是 form 模块已加载、DOM 已就位、没被 lay-ignore 拦住——不是 CSS 问题,是 Layui 的渲染机制在起作用。
为什么单选框初始是隐藏的
Layui 默认把原生 <input type="radio"> 和 <input type="checkbox"> 设为 display: none,靠 JS 插入美化后的 DOM 节点来替代。如果没触发渲染,你就只看到空白。
- 检查是否引入了
layui.js(不是layui.all.js)——旧版layui.all.js缺失部分模块会导致form不可用 - 确认
lay/modules/form.js存在(精简版常误删此文件) - 看控制台有没有
Uncaught TypeError: layui.form is not a function,有就说明模块没加载成功
form.render() 必须在正确时机执行
渲染不是“写完 HTML 就自动生效”,而是依赖 DOM 已挂载、且 form 实例已初始化。
- 静态页面:在
<script></script>标签里用layui.use('form', () => { form.render(); }) - 弹出层(layer.open)中动态插入的表单:必须在
success回调里执行form.render(),否则 layer 还没把内容 append 到 DOM,form找不到元素 - 表格行内编辑(table templet):在
done回调或cell事件里调用form.render('radio', 'your-filter'),避免全量重绘影响性能
常见失效场景和绕过方法
即使调了 form.render() 还不显示,大概率卡在这些细节上:
-
lay-ignore写在了父容器或单个input上——它会跳过渲染,删掉这个属性就行 - radio 的
name值不一致(比如一个写name="type",另一个写name="TYPE")——Layui 按 name 分组识别,大小写敏感 - 用了 Vue/React 等框架,DOM 是响应式更新的,但
form.render()只执行一次——需在数据更新后手动再调一次 - 想通过 JS 设置默认选中:不能只改
checked属性,要配合form.render(),否则美化节点不会同步状态
最易被忽略的一点:form.render() 不会修复缺失的 title 属性。Layui 的 radio 渲染依赖 title 生成文字标签,漏写 title="男" 就只显示一个空圆圈——哪怕 form.render() 成功执行了,也照样看不见。











