前端|基于 Layui 实现动态搜索选择框

💡 原文中文,约2500字,阅读约需6分钟。
📝

内容提要

本文介绍了后端程序员在实现网页动态搜索选择框时的思考和方案。作者最终选择了基于Layui的dropdown组件来实现需求。文章提供了示例代码,并总结了冷静思考需求和场景的重要性。

🔎

延伸解读

为何不直接用 Layui 的 select 搜索框

Layui 的 select 组件定位是只能赋值选项列表中的值,其搜索功能仅从前端已有选项中匹配,无法根据用户输入动态向后端请求新数据。而本文需求要求下拉选项完全由后端根据输入内容返回,因此 select 无法满足。作者尝试覆盖 input 或监听渲染后的 input 事件,但都存在选项列表无法点击空白关闭、焦点和输入内容保持等问题,最终放弃。

dropdown 组件如何实现动态搜索选择

作者采用 input + dropdown 组合,利用 dropdown 的 reloadData API 动态更新选项列表。在 input 的 input 事件中获取输入值,通过 ajax 请求后端数据,成功后再调用 reloadData 刷新下拉选项。点击选项时,将选项值填入 input 并添加 data-id 属性记录选中项 id,提交时使用该 id 作为参数值。输入时需移除 data-id,失焦时若没有 data-id 则清空输入,确保最终提交的值必须来自选项列表。

实现中的关键细节与注意事项

示例代码中 mockData 需替换为实际的 ajax 请求,并在成功拿到数据后再调用 reloadData。表单提交时需使用 id 作为参数值,可在 click 事件中给 input 添加自定义属性如 data-id,并在输入监听事件中删除该属性。失焦时若没有 data-id 则清空输入,避免提交非选项值。这些细节保证了动态搜索选择框的交互完整性和数据有效性。

从需求出发选择合适组件

作者总结,冷静思考需求和场景有助于更快找到合适的组件和方案。最初执着于 select 组件,但因其搜索是纯前端行为,无法满足后端动态返回选项的需求。转而使用 dropdown 组件后,利用其 reloadData API 和自定义 input 事件,顺利实现了动态搜索选择框。这提醒开发者,在实现功能前先明确需求本质,避免在不适用的组件上浪费时间。

❓

Q&A

如何基于 Layui 实现动态搜索选择框?

使用 Layui 的 dropdown 组件,结合 input 元素。通过监听 input 的输入事件,调用 dropdown 的 reloadData API 动态更新下拉选项列表。示例代码中,先渲染 dropdown,然后监听 input 的 input 和 propertychange 事件,在事件处理函数中获取输入值,调用 mockData(实际应替换为 ajax 请求)获取新数据,再通过 reloadData 更新下拉列表。

为什么 Layui 的 select 组件不适合实现动态搜索选择框?

Layui 的 select 组件定位是只能赋值选项列表中的值,其搜索功能仅是从现有选项中匹配,属于纯前端行为。而动态搜索选择框需要根据用户输入内容从后端动态获取选项列表,select 组件没有暴露监听输入内容的事件接口,无法直接实现。

在 Layui 中实现动态搜索选择框时,如何确保提交的值是选项列表中点选的?

在 dropdown 的 click 回调中,将选中项的 id 通过 data-id 属性添加到 input 元素上。表单提交时使用该 data-id 作为参数值。同时,在输入监听事件中移除 data-id 属性,并在 blur 事件中检查,如果 data-id 不存在则清空输入框,确保只有点选的值才有效。

Layui 官方对实现可输入可下拉可搜索的选择框有什么建议?

Layui 作者贤心建议:select 组件的定位就是只能赋值选项列表中的值,包括搜索也只是从选项中匹配。若要支持自定义输入的值,可以借助 input + dropdown 组件来自定义实现。

基于 Layui 实现动态搜索选择框时,如何处理下拉选项列表的刷新?

使用 Layui dropdown 组件的 reloadData API。在 input 的输入事件监听中,获取用户输入内容,通过 ajax 请求(示例中为 mockData)获取新的选项数据,然后调用 dropdown.reloadData(inst.config.id, { data: dataNew }) 来刷新下拉列表。

在 Layui 动态搜索选择框的实现中,为什么选择 dropdown 组件而不是其他方案?

因为 dropdown 组件提供了 reloadData API,可以方便地动态更新下拉数据。而基于 select 的方案要么需要覆盖 input 并手动处理选项列表的关闭,要么需要干预下拉展示/隐藏、焦点等,实现不够完美。dropdown 组件更灵活,适合自定义实现。

🏷️

标签

➡️

继续阅读