必须确保HTML的lay-filter、table.render的elem与table.on的filter三处完全一致,否则事件静默失效;存取时需统一字段名、加时间戳标识、只存关键ID而非全量数据,并在done回调中校验ID有效性。
直接用 table.on('row(filter)') 绑定,回调里调 localstorage.setitem() 即可,但必须确保 filter 字符串和渲染时的 lay-filter 一致,否则事件根本不会触发。
table.on('row(filter)') 事件绑定失败的三个硬性条件
这个事件不是“写了就生效”,它依赖三处严格匹配:
- HTML 容器(如
<table id="demo">)必须带lay-filter="userTable"属性 -
table.render()的参数里elem指向该容器,且没覆盖lay-filter -
table.on('row(userTable)', callback)中的userTable必须和上面两处完全相同,大小写、空格、引号都不能错
漏掉任一环,console.log 都不会执行,也不会报错——静默失效是最容易卡住的地方。
为什么 obj.data 存进去后取出来是空或结构异常
常见原因是原始数据字段名和列配置 field 不一致,导致 Layui 内部映射失败。比如后端返回 user_id,但你在 cols 里写的是 field: 'id',此时 obj.data.id 是 undefined,而 obj.data.user_id 才有值。
- 推荐统一字段名:后端返回时就转成前端需要的 key,或在
parseData回调里做一次映射 - 存的时候别只存
obj.data,加个时间戳和来源标识更稳妥:localStorage.setItem('selectedRow-userTable', JSON.stringify({data: obj.data, ts: Date.now()})) - 不要用
JSON.parse(localStorage.getItem(...))直接赋值给变量后操作,先判空和类型:const raw = localStorage.getItem('selectedRow-userTable'); const row = raw ? JSON.parse(raw).data : null;
点击行后想高亮并持久化选中状态,但翻页就丢
Layui 表格本身不跨页维护选中态,obj.data 只反映当前页的数据快照。如果你存的是整行对象,翻页后再次点击同一行,obj.data 的 id 还在,但其他字段可能因分页参数变化而不同。
- 只存关键标识字段(如
id或uuid),而不是整个obj.data,避免冗余和过期风险 - 如果必须存全量数据,记得在
done回调里检查当前页是否包含该id,再手动加layui-table-hover类 - 不要在
row回调里反复setItem同一个 key,高频点击会导致 localStorage 写入抖动,尤其在低性能设备上
真正难的不是存,而是怎么让“存”和“取”在多页、重载、缓存清理等场景下还能对得上——字段一致性、key 命名空间、数据时效性,这三点漏掉任何一个,后续读取就会出问题。


















