讲师中心 微信公众号
AI工具推荐 视频效率加速

Vue.js 自动完成搜索组件实现教程

雨婷吖_3060

雨婷吖_3060

发布时间:2025-11-22 13:08:23

|

596人浏览过

|

来源于php中文网

原创

Vue.js 自动完成搜索组件实现教程

本教程详细介绍了如何在 vue.js 应用中构建一个响应式的自动完成搜索组件。文章涵盖了数据管理、基于用户输入的实时过滤逻辑、搜索结果的动态显示与隐藏机制,以及如何通过 css 实现下拉列表的布局。通过学习,您将掌握构建高效、用户友好的搜索输入框的关键技术,从而提升应用的交互体验。

在现代Web应用中,自动完成(Autocomplete)搜索功能已成为提升用户体验不可或缺的一部分。它能帮助用户快速找到所需信息,减少输入错误,并提供即时反馈。本教程将指导您如何在 Vue.js 环境下,从零开始构建一个功能完善的自动完成搜索组件。

核心功能概述

一个典型的自动完成组件通常包含以下几个核心功能:

  1. 数据绑定与过滤: 实时监听用户输入,并根据输入内容过滤预设的数据列表。
  2. 动态显示: 当有匹配结果时,显示下拉列表;当无匹配或输入为空时,隐藏列表。
  3. 响应式布局: 确保下拉列表能够正确地定位在输入框下方。
  4. “点击外部关闭”: 当用户点击输入框外部时,自动隐藏下拉列表。

组件结构与实现

我们将使用 Vue.js 的数据绑定、计算属性和事件处理来构建此组件。

1. Vue 实例与数据模型

首先,定义 Vue 实例的数据(data)和计算属性(computed)。

立即学习“前端免费学习笔记(深入)”;

var app = new Vue({
  el: "#app",
  data() {
    return {
      show: false, // 控制搜索结果列表的显示与隐藏
      search: '',  // 绑定搜索输入框的值
      caminhos: [   // 预设的搜索数据列表
        {id: 1, title: "plano individual", rotas: "www.google.com"},
        {id: 2, title: "plano ", rotas: "HelloWorld.vue"},
        {id: 3, title: "plano abstrato individual", rotas: "HelloWorld.vue"},
        {id: 4, title: "plano terceiro individual", rotas: "HelloWorld.vue"},
        {id: 5, title: "plano nada individual", rotas: "HelloWorld.vue"},
      ]
    }
  },
  computed: {
    // 根据搜索关键词过滤数据
    filteredItems() {
      // 只有当搜索关键词长度大于等于3时才进行过滤
      if (this.search.length >= 3) {
        return this.caminhos.filter(item => {
          return item.title.toLowerCase().includes(this.search.toLowerCase());
        });
      } else {
        return null; // 不满足条件时返回null,表示不显示列表
      }
    }
  }
});

代码解析:

使用华数设计生成高保真HTML原型、演示文稿、动画和设计评审
使用华数设计生成高保真HTML原型、演示文稿、动画和设计评审

使用经过文档化的设计技能,从真实的品牌或项目背景中生成HTML原生原型、幻灯片、动态演示、可视化图表和评审流程。

下载
  • show: 一个布尔值,用于控制搜索结果列表的可见性。
  • search: 通过 v-model 绑定到输入框,实时获取用户输入。
  • caminhos: 存储所有可供搜索的数据项。每个项包含 id、title 和 rotas(路由或链接)。
  • filteredItems (计算属性):
    • 这是一个关键的计算属性,它根据 search 变量的值动态过滤 caminhos 数组。
    • 为了避免在用户输入过少时显示大量不相关的结果,我们设置了一个条件:只有当 search 字符串的长度大于或等于3时才执行过滤。
    • toLowerCase() 和 includes() 方法用于实现不区分大小写的模糊匹配。
    • 当不满足过滤条件时,返回 null,这将在模板中用于控制列表的渲染。

2. 模板结构与动态渲染

接下来,我们构建 HTML 模板,结合 Vue 指令实现动态交互。

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <div class="dropdown">
    <input
      @focus="show = true"  // 输入框获得焦点时显示列表
      @blur="show = false"   // 输入框失去焦点时隐藏列表
      type="search"
      class="form-control"
      placeholder="Type query"
      aria-label="Search"
      v-model="search"
    />
    <template v-if="show && filteredItems">
      <ul class="list-group">
        <li v-for="obj in filteredItems" v-bind:key="obj.id">
          <a v-bind:href="obj.rotas">{{obj.title}}</a>
        </li>
      </ul>
    </template>
  </div>
</div>

代码解析:

  • 外部 div.dropdown: 这是一个容器,用于定位搜索输入框和结果列表。
  • input 元素:
    • v-model="search":将输入框的值与 Vue 实例的 search 数据属性双向绑定。
    • @focus="show = true":当输入框获得焦点时,将 show 设置为 true,准备显示搜索结果。
    • @blur="show = false":当输入框失去焦点时,将 show 设置为 false,隐藏搜索结果。这是实现“点击外部关闭”的一种简单方式,当焦点从输入框移开时,列表就会隐藏。
  • template v-if="show && filteredItems":
    • 使用
    • v-if 指令确保只有当 show 为 true(输入框有焦点)并且 filteredItems 不为 null 或空(有匹配结果)时,才会渲染结果列表。
  • ul.list-group: 用于显示过滤后的搜索结果。
  • li v-for="obj in filteredItems": 遍历 filteredItems 数组,为每个匹配项生成一个列表项。
    • v-bind:key="obj.id":为 v-for 循环中的每个元素提供一个唯一的 key,这有助于 Vue 高效地更新列表。
    • a v-bind:href="obj.rotas":为每个结果项创建一个链接,其 href 属性绑定到 obj.rotas。

3. 样式(CSS)

为了使搜索结果列表能够正确地显示在输入框下方,并实现下拉效果,我们需要添加一些 CSS 样式。

<style>
.dropdown {
  position: relative; /* 使下拉列表相对于此容器定位 */
  width: 300px; /* 示例宽度,可根据需要调整 */
}

.dropdown input {
  width: 100%; /* 输入框占据容器的全部宽度 */
}

.dropdown .list-group {
  position: absolute; /* 使列表脱离文档流,进行绝对定位 */
  left: 0;            /* 列表左侧与容器左侧对齐 */
  right: 0;           /* 列表右侧与容器右侧对齐,实现与输入框同宽 */
  z-index: 1000;      /* 确保列表在其他内容之上 */
  background-color: #fff; /* 背景色,避免内容被遮挡 */
  border: 1px solid #ddd; /* 边框 */
  box-shadow: 0 2px 4px rgba(0,0,0,0.1); /* 阴影效果 */
  max-height: 200px; /* 设置最大高度,超出部分滚动 */
  overflow-y: auto; /* 垂直滚动条 */
}

.dropdown .list-group li {
  padding: 8px 12px;
  cursor: pointer;
}

.dropdown .list-group li:hover {
  background-color: #f0f0f0;
}

.dropdown .list-group li a {
  text-decoration: none;
  color: #333;
  display: block; /* 使整个li区域可点击 */
}
</style>

样式解析:

  • .dropdown:设置为 position: relative 是关键,它为内部的绝对定位元素(.list-group)提供了一个定位上下文。
  • .dropdown .list-group:
    • position: absolute:使列表脱离正常的文档流,可以精确地定位。
    • left: 0; right: 0;:让列表的宽度与父容器(.dropdown,也就是输入框的宽度)保持一致。
    • z-index:确保下拉列表显示在其他内容之上。
    • 添加了背景色、边框、阴影和滚动条,以提供更好的视觉和交互体验。

注意事项与进阶优化

  1. @blur 事件的局限性: 简单的 @blur="show = false" 在某些情况下可能导致用户无法点击到搜索结果列表中的项。因为当用户试图点击列表项时,输入框会立即失去焦点,触发 blur 事件,导致列表隐藏。
    • 解决方案: 可以使用 setTimeout 延迟 blur 事件的执行,或者通过检查 event.relatedTarget 来判断焦点是否转移到了列表项内部。更健壮的方案是监听整个组件外部的点击事件,或者使用第三方 Vue 下拉组件库。
  2. 性能优化(防抖/节流): 对于大型数据集或频繁的输入,实时过滤可能会导致性能问题。可以使用防抖(Debounce)或节流(Throttle)技术来限制 filteredItems 计算属性的执行频率。
  3. 键盘导航: 为了更好的用户体验,可以添加键盘上下箭头导航、回车选中等功能。
  4. 无结果提示: 当 filteredItems 为空数组时,可以显示“未找到匹配项”的提示。
  5. Vue 3 适用性: 尽管示例代码是基于 Vue 2 的 Options API,但核心逻辑(数据绑定、计算属性、条件渲染、列表渲染)在 Vue 3 中同样适用。在 Vue 3 中,您可以使用 Composition API 的 ref 和 computed 函数来组织代码,实现相同的效果。

总结

通过本教程,我们学习了如何利用 Vue.js 的核心特性,包括数据绑定 (v-model)、条件渲染 (v-if)、列表渲染 (v-for) 和计算属性 (computed),来构建一个功能强大的自动完成搜索组件。同时,我们还探讨了如何通过 CSS 进行布局,以及在实际开发中可能遇到的问题和优化方向。掌握这些技术,将使您能够为用户提供更加智能和便捷的搜索体验。

热门AI工具

更多
切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

549

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1698

2024.03.01

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1878

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3024

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6304

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6289

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7854

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

11994

2024.04.29

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 1.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn