简介
在前端开发中,实现搜索功能是非常常见的需求。本文将介绍如何使用 Vue 框架实现一个仿百度搜索的功能,并提供示例代码和详细说明。
实现思路
仿百度搜索的功能主要由以下几个部分组成:
- 输入框:用户输入搜索关键字。
- 搜索建议列表:根据用户输入的关键字显示相应的搜索建议。
- 搜索结果列表:根据用户输入的关键字显示相应的搜索结果。
我们可以将整个搜索功能拆分成三个组件:
SearchBox
组件:包含一个输入框和一个按钮,用于接收用户输入的搜索关键字,并触发搜索事件。SuggestionList
组件:用于显示搜索建议列表。ResultList
组件:用于显示搜索结果列表。
接下来我们分别来实现这三个组件。
SearchBox 组件
-- -------------------- ---- ------- ---------- ---- ------------------- ------ ----------- ----------------- -------------------- -- ------- --------------------------------- ------ ----------- -------- ------ ------- - ------ - ------ - -------- --- -- -- -------- - -------------- - ------------------- ---------------- -- -------------- - -------------------- -------------- -- -- -- --------- ------- ----------- - -------- ----- - ----- - ----- -- - ------ - ------------ ----- - --------
SearchBox
组件包含一个输入框和一个按钮,使用 v-model
指令将用户输入的搜索关键字与 keyword
数据绑定,当用户输入时触发 handleInput
方法,通过 $emit
方法向父组件发送输入事件。当用户点击搜索按钮时触发 handleSearch
方法,通过 $emit
方法向父组件发送搜索事件。
SuggestionList 组件
-- -------------------- ---- ------- ---------- ---- ----------------------- ---------------------------- ---- --- ------------------- ------ -- ------------ ------------ ---------------------------------- -- ---------- -- ----- ----- ------ ----------- -------- ------ ------- - ------ - ------------ - ----- ------ -------- -- -- --- -- -- -------- - ------------------------ - -------------------- ------------ -- -- -- --------- ------- ---------------- - --------- --------- ----------------- ----- ------- --- ----- ----- ----------- ----- -------- ---- ------ ----- - -- - ----------- ----- -------- -- ------- -- - -- - -------- ---- ------- -------- - -------- - ----------------- -------- - --------
SuggestionList
组件根据用户输入的关键字显示相应的搜索建议列表。当搜索建议不为空时,通过 v-show
指令控制组件的显示和隐藏。使用 v-for
指令将每个搜索建议渲染到列表中,并为每个搜索建议绑定 click
事件,当用户点击某个搜索建议时触发 handleSelect
方法,通过 $emit
方法向父组件发送选择事件。
ResultList 组件
-- -------------------- ---- ------- ---------- ---- -------------------- ---- --- --------------- ------ -- -------- ------------- -- --------------------- ------------ ------ ----- ------------------ ------ ----- ----- ------ ----------- -------- ------ ------- - ------ - -------- - ----- ------ -------- -- -- --- -- -- -- -- - ---------------------------------------------------------- -------- --------------------------------------------------------------------------------