原生 showSearch: true 无法实现左右面板独立搜索,因其采用单源匹配后重分配逻辑,仅左侧有搜索框且右侧无响应;需禁用内置搜索,手动为左右面板添加输入框,本地过滤原始数据并控制 DOM 显示状态,同时排除 disabled 项以保持选中态一致性。
原生 showsearch: true 只能单向过滤原始数据源,左右面板不会独立响应搜索——这是最常被卡住的点。真要实现“左搜左、右搜右”,必须绕过内置搜索,手动加输入框 + 本地过滤 + dom 控制。
为什么 showSearch: true 不满足左右独立搜索?
Layui 的搜索逻辑是:输入关键词 → 在整个 data 数组里匹配 → 按当前左右分布状态,把匹配项分别渲染到左/右面板。它不关心你当前在哪边输,也不维护两个独立视图。所以右侧面板根本没搜索框,更不会响应输入。
- 现象:只在左侧顶部出现一个搜索框,右侧无反应
- 本质:不是“双视图过滤”,而是“单源匹配后重分配”
- 后果:无法实现“只看右边已选中里含‘Java’的项”这类需求
如何手动实现左右面板各自搜索?
禁用内置搜索,为左右面板容器各加一个 <input type="text">,监听 input 事件,对原始数据做本地过滤,再控制对应面板的 DOM 显示状态。
- 第一步:设置
showSearch: false,避免干扰 - 第二步:在
.layui-transfer-box.layui-transfer-box-left和.layui-transfer-box.layui-transfer-box-right上方插入两个<input class="search-left">和<input class="search-right"> - 第三步:用
transfer.getChecked('left')或transfer.getChecked('right')获取当前面板选中项(仅用于判断是否需保留状态) - 第四步:过滤时遍历原始
data,按title字段匹配,并显式排除disabled: true项(否则 disabled 项仍会出现在搜索结果里) - 第五步:轻量操作 DOM —— 找到所有
.layui-transfer-item,设style.display = 'none'或'block',比transfer.reload()更安全(后者会清空当前选中)
搜索时 disabled 项要不要显示?
默认会显示。只要 title 包含关键词,即使 disabled: true,也会被匹配出来,只是 checkbox 置灰不可选。用户看到“搜出来了却点不了”,容易困惑。
- 解决办法:过滤逻辑里加条件
item.disabled !== true - 注意:这个判断不能只靠 UI 状态(比如 class 名),必须读取原始数据里的
disabled字段 - 常见坑:用 jQuery 的
:visible或:disabled伪类去筛选 DOM,不可靠——因为 DOM 状态和数据状态可能不同步
真正麻烦的不是写几行过滤代码,而是保持“搜索态”和“选中态”的一致性:比如左边搜出 3 条,用户全选,再切到右边搜,左边刚选的还得保留。这种交叉状态管理,得靠缓存 value 数组 + reload 前还原,或者干脆放弃 reload,全程只操作 display。


















