Vue.js 中如何实现搜索框的 autocomplete 功能?

阅读时长 10 分钟读完

当我们在搜索引擎或者电商平台的搜索框中输入关键词时,通常会看到搜索框下面出现关键词的提示或者搜索结果的推荐。这就是 autocomplete 功能,可以帮助用户快速、准确地输入搜索关键词。

在 Vue.js 中,可以使用第三方库或者自己实现 autocomplete 功能。下面我们来介绍如何使用 Vue.js 实现搜索框的 autocomplete 功能。

1. 使用第三方库

Vue.js 生态圈中有很多和 autocomplete 相关的第三方库,比如 vue-awesompletevue-autosuggestvue2-autocomplete 等等。这些库使用方便、功能完善,可以满足大部分需求。

下面以 vue-awesomplete 为例,介绍如何使用它实现搜索框的 autocomplete 功能。

安装和使用

首先,使用 npm 安装 vue-awesomplete:

然后在组件中使用 vue-awesomplete:

-- -------------------- ---- -------
----------
  -----
    ------ ----------- ---------------- --
    ----
      --- --------------- ------ -- -------- --------------- ------ -------
    -----
  ------
-----------

--------
------ ----------- ---- ------------------

------ ------- -
  ----------- - ----------- --

  ------ -
    ------ -
      ------- ---
      -------- ---
    --
  --

  -------- -
    ----- -------------- -
      -- ----- ------------------- ---- --
      ----- -------- - ----- ---------------------------------------------------------------------
      ----- ---- - ----- ----------------
      ----- ------- - ------------------- -- ----------------

      ------------ - --------
    --
  --

  ------ -
    -------- -
      --------------------
    --
  --
--
---------

通过 v-model 绑定搜索框的值,通过 watch 监听搜索框的值的变化,并通过 searchAction 方法获取搜索结果,在搜索结果发生变化时更新 results 数组,最后在模板中循环输出搜索结果。

配置和样式

vue-awesomplete 提供了很多可配置的选项,比如 minChars 指定输入最小字符数、maxItems 指定最多显示项数、item 指定模板等等。可以参考官方文档实现更多自定义功能:https://github.com/LeaVerou/awesomplete#api

另外还需要引入 awesomplete 的 CSS 样式,默认情况下,这些样式不会自动应用到我们的组件中。可以在组件内加入以下代码:

2. 自己实现

虽然使用第三方库可以方便快捷地实现 autocomplete 功能,但是了解如何自己实现也很重要,可以更好地掌握 Vue.js 中的一些基本概念和实践技巧,加深对其的理解。

下面介绍如何自己实现搜索框的 autocomplete 功能。

定义组件

首先,定义 Autocomplete 组件,包含一个输入框和下拉菜单:

-- -------------------- ---- -------
----------
  ---- ---------------------
    ------ ----------- ---------------- --
    ---- ------------ ----------------------
      ----
        --- --------------- ------ -- -------- -------------
          -- -------- -------------------------------------- ------ ------
        -----
      -----
    ------
  ------
-----------

v-model 绑定搜索框的值到 search 变量上,v-if 根据结果数组的长度来判断是否显示下拉菜单,v-for 循环结果数组,动态渲染下拉菜单的选项,点击选项时调用 selectItem 方法选中选项。

-- -------------------- ---- -------
------------- -
  --------- ---------
-

----- -
  --------- ---------
  ---- -----
  ------- --- ----- -----
  ----------------- ------
  ----------- ------
  --------- -----
  ------ -----
-

----- -- -
  ------- --
  -------- --
  ----------- -----
-

----- -- -
  ------- --
  -------- --
-

----- - -
  -------- ------
  -------- --- -----
  ---------------- -----
  ------ -----
-

----- ------- -
  ----------------- --------
-

定义 CSS 样式,使下拉菜单定位在搜索框下面,具有基本的样式。

添加数据

Autocomplete 组件中定义 data 属性 resultskeywords,其中 results 保存搜索结果,keywords 保存数据源,可以是本地数组或者异步请求返回的数据:

-- -------------------- ---- -------
------ -
  ------ -
    ------- ---
    -------- ---
    --------- -
      -------- --------- --------- ------- -------------
      ------ ------------- ----------- ------- -----
    --
  --
--

created 钩子函数中加载数据,这里使用本地数组 keywords

监听输入框的值

使用 watch 监听搜索框的值的变化,并根据输入的值从数据源中查找匹配的项:

-- -------------------- ---- -------
------ -
  -------- -
    -- ------------------- -- -- -
      ------------ - ---------------------------- --
        -----------------------------------------------------------
    - ---- -
      ------------ - ---
    -
  --
--

当输入框的值长度大于等于 2 时,使用 JS 的 filter 方法过滤数据源中包含搜索框的值的项,并将结果保存到 results 中。

当输入框的值长度小于 2 时,清空结果数组。

选中项

selectItem 方法中将选中的项赋值给 search 变量,并清空结果数组:

完整代码

-- -------------------- ---- -------
----------
  ---- ---------------------
    ------ ----------- ---------------- --
    ---- ------------ ----------------------
      ----
        --- --------------- ------ -- -------- -------------
          -- -------- -------------------------------------- ------ ------
        -----
      -----
    ------
  ------
-----------

--------
------ ------- -
  ------ -
    ------ -
      ------- ---
      -------- ---
      --------- -
        -------- --------- --------- ------- -------------
        ------ ------------- ----------- ------- -----
      --
    --
  --

  --------- -
    ---------------------
  --

  -------- -
    ---------------- -
      ----------- - -----
      ------------ - ---
    --
  --

  ------ -
    -------- -
      -- ------------------- -- -- -
        ------------ - ---------------------------- --
          -----------------------------------------------------------
      - ---- -
        ------------ - ---
      -
    --
  --
--
---------

-------
------------- -
  --------- ---------
-

----- -
  --------- ---------
  ---- -----
  ------- --- ----- -----
  ----------------- ------
  ----------- ------
  --------- -----
  ------ -----
-

----- -- -
  ------- --
  -------- --
  ----------- -----
-

----- -- -
  ------- --
  -------- --
-

----- - -
  -------- ------
  -------- --- -----
  ---------------- -----
  ------ -----
-

----- ------- -
  ----------------- --------
-
--------

总结

Vue.js 中实现搜索框的 autocomplete 功能,可以使用第三方库或者自己实现。使用第三方库可以方便快捷地实现自己的需求,尤其针对复杂的场景。而自己实现可以更好地掌握 Vue.js 中的基本概念和实践技巧,加深对其的理解。

以上是 Vue.js 实现搜索框的 autocomplete 功能的详细讲解和示例代码,希望对你有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65ba162dadd4f0e0ff2a23d4

纠错
反馈