layui radio 不自动记录上一个选中值,需手动维护变量(如 let lastRadioValue = null),在 form.on('radio()') 回调中先读旧值再更新,并在表单重渲染时重置该变量以避免状态污染。

layui radio 本身不记录上一个选中值
layui 的 form.on('radio()') 回调只提供当前点击项的 data.value 和 this.checked,不会自动保存或暴露“上一个”值。它不是状态机,没有内置的 prev/last 缓存机制。
必须手动维护上一个值的变量
最直接、最可控的方式是在监听回调外声明一个变量,在每次触发时先读旧值、再更新新值:
- 定义一个作用域内可访问的变量,比如
let lastRadioValue = null - 在
form.on('radio(filterName)', function(data){...})中,先使用lastRadioValue做逻辑判断(如还原某状态、取消关联项),再赋新值:lastRadioValue = data.value - 注意:首次触发时
lastRadioValue是null或初始值,需做空值判断
别依赖 form.val() 反推“上一个”
form.val('filter') 只返回当前所有字段的最新快照,无法回溯历史。有人试图在回调里两次调用 form.val()(一次在赋值前、一次在赋值后),但这是错的——因为 form.val() 读的是 layui 内部同步后的状态,而 radio 切换是原子操作,两次调用结果必然一致。
动态渲染或异步加载时要重置缓存变量
如果表单被重新渲染(比如调用 form.render())、或整块 DOM 被替换(如 tab 切换、弹窗重载),之前存的 lastRadioValue 就失效了:
- 在重新渲染前,主动清空或重置该变量,比如设为
null - 若默认选中项来自服务端,可在渲染完成后的
done回调里初始化lastRadioValue,避免首次点击时误判
真正麻烦的不是怎么存,而是什么时候该清——尤其在多 tab、弹窗复用同一 form 结构时,变量容易跨上下文污染。建议把该变量绑定到具体 DOM 容器上(如 form.dataset.lastRadio = 'xxx'),而不是全局或闭包顶层声明。


















