lay-search需满足layui≥2.9.16、select在layui-form内、未调用form.render前插入dom才生效;本地过滤支持前缀/子串/大小写匹配,远程搜索须弃用原生select改用layui.select模块。

能设置,但必须分清「本地过滤」和「远程搜索」两种路径——选错方式会导致搜不出结果、事件失效或请求发不出。
lay-search 属性怎么写才生效
原生 lay-search 只在满足三个硬条件时才出现输入框:Layui ≥ 2.9.16、<select></select> 必须包裹在 <form class="layui-form"></form> 内、没调用 form.render() 前就插入 DOM。
-
lay-search(无值)或lay-search="":启用默认前缀匹配(输“上”出“上海”,但输“海上”不中) -
lay-search="{fuzzy: true}":开启子串匹配(输“京”命中“北京市”“朝阳区”) -
lay-search="{caseSensitive: true}":区分大小写,适合字段名、编码类数据 - 低版本(如 2.8.x)写成对象会静默忽略,只当布尔值处理
为什么加了 lay-search 却没搜索框
最常见原因是外层缺失 layui-form 或 form.render() 调用时机不对。动态插入 <select></select> 后,必须显式调用 form.render('select'),否则 Layui 根本不扫描它。
- CSS 覆盖:某些定制主题把
.layui-form-select .layui-input设为display: none,导致输入框不可见 - 渲染冲突:如果用了
form.on('select(xxx)')监听,又同时开了lay-search,可能因 DOM 替换导致事件绑定丢失 - 表单校验干扰:
lay-verify规则若含required,可能阻止搜索框获得焦点
远程搜索必须弃用原生 select
原生 lay-search 不发请求,只做本地过滤。想根据关键词查后端,得用 layui.select 模块,且不能写 <select lay-search></select>。
- HTML 里用
<div id="search-box"></div>占位,不要放<select></select> - JS 中调用
layui.use(['select'], function(){...}),再select.render() - 关键配置:
search: false(关掉本地过滤),靠request函数拼keyword参数发请求 - 后端返回的数据必须符合
parseData要求:返回{code: 0, data: [{value: '1', title: '北京'}]}
模糊匹配中文时拼音支持要自己补
Layui 原生不解析拼音,输“bei”不会出“北京”。得提前给每个 <option></option> 加 data-pinyin="beijing",再重写匹配逻辑。
- 监听下拉展开事件,清空并重写
<dl></dl>内的<dd></dd> - 匹配时同时比对
text()和data('pinyin'),用includes()或正则 - 不能直接操作
select.innerHTML,否则form.on('select')失效、校验样式丢失 - 高亮匹配字符要用
highlightText(text, keyword)函数,再注入到<dd></dd>的 HTML 中
真正麻烦的不是写法,而是状态同步——比如多级联动时,上一级还没选完,下一级的搜索请求就发出去了;或者防抖没做,用户连打“shangh”触发了 5 次请求,只有一条响应能正确渲染。这些细节不压住,搜索功能看着能动,实际一用就错位。











