where 必须是函数,不能写死对象;reload 时需显式重置 page.curr 为 1,且字段名、请求方式、编码须与后端严格一致,动态换接口须在 reload 中传 url 参数。
where 必须是函数,不能写死对象
直接写 where: {name: $('#search-name').val()} 是无效的——这个值只在初始化时取一次,后续输入变化完全不会更新。layui 每次 reload 都会重新执行 where 函数,所以必须让它返回实时值。
- 正确写法:
where: () => ({q_name: $('#search-name').val().trim(), status: $('#status-select').val()}) - 空值要主动过滤:比如
$('#search-name').val().trim()为空时,整个字段不该传给后端,除非接口明确要求传空字符串 - 别在函数里调用
table.reload(),否则触发无限循环 - 多个搜索框建议统一收口到一个对象里再 return,避免零散取值出错
搜索按钮 click 事件里必须显式 reload 并重置 curr
表格本身不监听外部输入框,点搜索按钮后必须手动触发刷新,且页码要归 1,否则可能搜出“空结果”(实际数据在第 2 页但你还在看第 5 页)。
- 用实例方法:
tableIns.reload({ where: {...}, page: { curr: 1 } }) - 用静态方法:
table.reload('tableId', { where: {...}, page: { curr: 1 } }) - 别漏掉
page: { curr: 1 },这是最容易被忽略却最常导致“搜不到”的原因 - 如果用了分页,
curr不能为undefined,建议兜底写成curr: tableIns.config.page.curr || 1
后端收不到参数?先查请求方式和字段名
Layui 默认用 GET 发请求,所有 where 字段都拼在 URL 上。如果你看到请求地址里没参数,大概率是字段名或编码出了问题。
- 检查浏览器 Network 标签页里实际发出的 URL,确认 key 名是否和后端约定一致(比如是
q_name还是name_like) - 中文或特殊字符没编码?确保前端没手动拼 URL,全部交给
where对象处理 - 后端用
@RequestParam接收时,GET 请求的参数必须匹配 URL 中的 key;如果是 POST + JSON,需额外配置contentType: 'application/json'和method: 'POST' - Spring Boot 中若用
@RequestBody接收整个 JSON,前端必须设contentType,且where里传的是字符串而非对象
动态换接口地址也得走 reload,config.url 不可赋值
想根据搜索条件切换不同后端接口?别碰 tableIns.config.url = '/new',这个属性是只读快照,改了也没用。
- 必须在
reload()里显式传url参数:tableIns.reload({ url: '/api/v2/list', where: {...} }) - 同时传
url、where、page、initSort(如果支持排序),缺一不可,否则表头排序状态丢失、页码跳回第 1 页等副作用都会出现 - 别传
done回调,除非你真要覆盖原始逻辑,否则会丢掉已写的加载后处理
where 函数是否真被调用、Network 里发出去的 URL 是否含预期参数、后端是否按 GET 参数还是 JSON body 解析——这三步缺一不可,漏查任意一个环节,参数就“消失”了。











