必须先用 layui.extend({xmselect: 'xm-select'}) 声明模块,再通过 layui.config({base: '/static/js/'}) 指定路径,且 xm-select.js 需在 layui.all.js 后、layui.use 前加载;data 与 setvalue 的 value 类型须严格一致(全 number 或全 string);远程搜索须禁用 lay-search,启用 filterable、remotesearch 并正确实现 remotemethod 中的 cb 回调。

怎么引入 xm-select 并让 layui 正确加载它
必须先通过 layui.extend() 告诉 layui 这个新模块存在,否则 layui.use(['xmSelect']) 会直接报错「module not found」。路径写法容易错:不是写 ./js/xm-select.js,而是只写模块名(不含后缀和路径),base 才管位置。
常见错误现象:Uncaught Error: Module xmSelect not found 或控制台空白无报错但下拉框不渲染。
-
layui.config({ base: '/static/js/' })—— 指向存放xm-select.js的目录(注意末尾斜杠) -
layui.extend({ xmSelect: 'xm-select' })—— 名字要和后续use里的一致,且不能带.js - 确保
<script src="/static/js/xm-select.js"></script>在layui.all.js之后、layui.use之前加载,否则模块注册失败
渲染多选下拉框时 data 和 value 的类型必须严格一致
data 里每个选项的 value 是 number,那默认选中或调用 setValue() 传的也得是 number 数组;如果是 string,就全用 string。混用会导致选中失效、回显为空、甚至 getValue('value') 返回空数组。
使用场景:从后端接口拿回的数据字段可能是 id(number)或 code(string),前端没做统一转换就直接塞进 data,然后又用字符串 ID 去 setValue(['A01']),结果什么都没选上。
- 静态数据示例:
data: [{ name: '管理员', value: 1 }, { name: '编辑', value: 'editor' }]→ 这种混合写法禁止 - 默认选中写成
value: [1, 3],哪怕只有一个也要写成数组:[2],不能写2 - 远程加载后调用
setValue()前,检查返回值是否和data中value类型对得上,必要时用map(x => ({ ...value: String(x.id) }))转换
远程搜索必须关掉 lay-search,改用 remoteMethod + filterable
原生 lay-search 属性和 xm-select 的远程搜索互斥。同时存在时,输入框看似能打字,但要么没请求、要么结果闪退、要么点击选项没反应——本质是两个搜索逻辑在 DOM 上打架。
正确配置的关键是三个开关全开且配合好:filterable: true(显示搜索框)、remoteSearch: true(启用远程模式)、remoteMethod 函数里必须调用 cb(dataArray, totalPage) 回传数据。
- 删掉
<select lay-search></select>或任何含lay-search的属性,xm-select 不读这个 -
remoteMethod的cb回调不可省略,哪怕只有一页数据也要写cb(list, 1),漏掉 totalPage 参数会导致分页异常 - 后端返回结构必须是标准数组,每项含
name和value;如果后端字段是label/id,必须在remoteMethod里手动映射:res.data.map(x => ({ name: x.label, value: x.id }))
setValue 和 getValue 容易忽略的细节
setValue() 不只是设值,它会触发重渲染并更新 UI;getValue() 默认返回对象数组,不是纯 value 列表。很多同学卡在「存了值但提交时拿不到」,其实是没指定参数。
性能影响:频繁调用 setValue()(比如在循环里)会引发多次 DOM 更新,大数据量时卡顿明显;getValue('value') 比 getValue() 快一个数量级,因为跳过了对象构造。
- 设值推荐写法:
instance.setValue([1, 2])或instance.setValue([{ name: '动态项', value: 999 }]) - 取纯 value 数组:
instance.getValue('value')→ 返回[1, 2];不传参则返回[{name:'xxx',value:1},...] - 如果下拉框还没初始化完成就调
setValue(),会静默失败,建议加个简单判断:if (instance) instance.setValue(...)
lay-search 当成远程搜索开关来用——这两点几乎占了所有「渲染了但搜不了/选不上」问题的 80%。











