layui分步骤表单核心是手动控制显隐、分步校验与状态管理;需用独立步骤容器、动态校验当前字段、form.render()重绘组件、全局对象缓存数据并单独处理laydate/layedit等特殊组件。

layui 表单分步骤填写的核心思路是什么?
layui 本身不提供原生的多步骤表单组件,layui.form 默认只处理单页表单渲染和校验。要实现分步骤填写,本质是手动控制表单项的显隐 + 分步校验 + 状态管理,而不是依赖某个内置函数。
关键判断:别找 layui.stepForm 或类似不存在的模块——你得自己组织 DOM 结构、切换显示、接管提交逻辑。
怎么用 layui 的 form.verify 配合步骤切换做校验?
form.verify 可以复用,但必须按当前步骤的字段动态触发,不能全局一次性校验。常见错误是点击“下一步”时直接调用 form.verify(),结果校验了所有字段(包括未显示的),导致误报。
- 每个步骤容器用独立 class 区分,比如
step-1、step-2 - “下一步”按钮绑定 click 事件,先提取当前步骤内所有
required字段的name - 调用
form.verify()前,临时修改form.config.verify的触发范围(不推荐),更稳妥的是用form.val('formFilter')获取当前步骤字段值,再手动遍历校验规则 - 示例:对
username和email做必填检查,就只取这两个字段的值,调用自定义校验函数,而非依赖form.on('submit')全局触发
注意:form.render() 不影响校验逻辑,但若步骤间有开关类组件(如 checkbox、select),切换时需调用 form.render('checkbox') 或 form.render('select') 重绘,否则状态不同步。
步骤切换时 DOM 怎么组织才不崩?
最易踩坑的是把所有表单项写在一个 form 标签里,然后用 display: none 切换——这会导致 layui 的自动绑定失效(比如 switch、radio 的渲染错乱,或 form.on('switch') 监听丢失)。
- 每个步骤用独立
div包裹,且都放在同一个form内(保持 submit 语义) - 切换时用
addClass('layui-hide')/removeClass('layui-hide'),而非hide()或内联 style - 所有表单元素(input、select、textarea)必须在 DOM 加载完成后再由
form.render()初始化一次;若某步骤是后续动态插入的(比如异步加载),必须在插入后立即调用form.render() - 避免在步骤容器上直接写
lay-submit,整个表单只有一个提交入口,步骤按钮统一用普通button,靠 JS 控制流程
怎么保存中间步骤数据并支持返回修改?
layui 不维护表单状态,全靠你自己存。常见做法是用一个全局对象缓存各步骤数据:
- 初始化时定义
var stepData = {} - 每次“下一步”前,调用
form.val('formFilter')获取当前步骤字段,合并进stepData对应 key(如stepData.step1 = {username: 'a', email: 'b'}) - “上一步”时,从
stepData中取出对应字段,用form.val('formFilter', data)回填 - 注意:回填后必须再调用
form.render(),否则 switch、radio 等组件不会同步 UI 状态
容易忽略的点:日期控件(laydate)、富文本(layedit)这类组件的数据不包含在 form.val() 结果里,需单独取值存取,比如 laydate.render().value 或 layedit.getContent(editIndex)。
步骤跳转逻辑越复杂,越要提前规划好数据结构和 DOM 生命周期——比如用户中途刷新页面,就得结合 localStorage 做持久化,这部分 layui 完全不介入。











