当前位置:首页 > VUE

vue3实现搜索

2026-02-25 05:23:04VUE

Vue 3 实现搜索功能

在 Vue 3 中实现搜索功能通常涉及以下几个核心步骤:

数据绑定与输入监听

使用 v-model 绑定搜索输入框的值,监听用户输入:

<template>
  <input v-model="searchQuery" placeholder="搜索..." />
</template>

<script setup>
import { ref } from 'vue';
const searchQuery = ref('');
</script>

过滤逻辑实现

基于输入内容过滤数据列表。如果是本地数据过滤:

const items = ref([/* 原始数据数组 */]);
const filteredItems = computed(() => {
  return items.value.filter(item => 
    item.name.toLowerCase().includes(searchQuery.value.toLowerCase())
  );
});

如果是远程搜索,通常结合防抖优化性能:

import { debounce } from 'lodash-es';

const searchRemote = debounce(async () => {
  const res = await fetch(`/api/search?q=${searchQuery.value}`);
  filteredItems.value = await res.json();
}, 300);

watch(searchQuery, searchRemote);

结果展示

在模板中渲染过滤后的结果:

<ul>
  <li v-for="item in filteredItems" :key="item.id">
    {{ item.name }}
  </li>
</ul>

高级优化技巧

  1. 空状态处理

    <div v-if="filteredItems.length === 0">没有找到匹配项</div>
  2. 高亮匹配文本

    const highlight = (text) => {
    const regex = new RegExp(searchQuery.value, 'gi');
    return text.replace(regex, match => `<span class="highlight">${match}</span>`);
    };
  3. 多字段搜索

    const filteredItems = computed(() => {
    const query = searchQuery.value.toLowerCase();
    return items.value.filter(item => 
     ['name', 'description', 'tags'].some(field => 
       String(item[field]).toLowerCase().includes(query)
     )
    );
    });

完整示例代码

<template>
  <div>
    <input v-model="searchQuery" placeholder="搜索..." />
    <ul v-if="filteredItems.length">
      <li v-for="item in filteredItems" :key="item.id">
        <span v-html="highlight(item.name)"></span>
      </li>
    </ul>
    <p v-else>没有搜索结果</p>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue';

const searchQuery = ref('');
const items = ref([
  { id: 1, name: 'Vue.js' },
  { id: 2, name: 'React' },
  { id: 3, name: 'Angular' }
]);

const filteredItems = computed(() => {
  const query = searchQuery.value.toLowerCase();
  return query 
    ? items.value.filter(item => 
        item.name.toLowerCase().includes(query)
      )
    : items.value;
});

const highlight = (text) => {
  const regex = new RegExp(searchQuery.value, 'gi');
  return text.replace(regex, match => `<span class="highlight">${match}</span>`);
};
</script>

<style>
.highlight {
  background-color: yellow;
  font-weight: bold;
}
</style>

注意事项

  • 对于大数据集考虑使用 Web Worker 进行后台过滤
  • 移动端注意虚拟滚动优化性能
  • 敏感字符输入需要进行转义处理防止 XSS 攻击
  • 远程搜索建议添加加载状态和错误处理

通过以上方法可以构建出高效且用户友好的搜索功能,根据实际需求选择本地过滤或远程搜索方案。

vue3实现搜索

分享给朋友:

相关文章

vue实现对话框效果

vue实现对话框效果

使用 Vue 实现对话框效果 在 Vue 中实现对话框效果可以通过组件化方式完成,通常结合 v-if/v-show 控制显示隐藏,以及插槽(slot)实现内容自定义。 基础对话框组件实现 创建一个名…

vue实现视窗

vue实现视窗

Vue 实现视窗功能 在 Vue 中实现视窗功能通常涉及监听浏览器窗口大小变化、响应式布局或创建自定义弹窗组件。以下是几种常见实现方式: 监听浏览器窗口大小变化 使用 Vue 的 mounted 和…

vue 实现菜单

vue 实现菜单

Vue 实现菜单的方法 使用 Vue 实现菜单可以通过多种方式,以下是几种常见的方法: 使用 Vue Router 实现动态路由菜单 通过 Vue Router 可以动态生成菜单,根据路由配置自动…

vue实现异步

vue实现异步

Vue 实现异步操作的常见方法 Vue 提供了多种方式来处理异步操作,包括数据获取、事件处理等场景。 使用 async/await 在 Vue 方法中可以直接使用 async/await 语法处理…

vue课程实现

vue课程实现

Vue 课程实现方案 课程内容设计 Vue课程应从基础到高级逐步展开,涵盖Vue核心概念、组件化开发、状态管理、路由、构建工具等。基础部分包括Vue实例、模板语法、计算属性和侦听器。中级部分深入组件通…

vue实现签章

vue实现签章

Vue 实现签章功能 签章功能通常包括手写签名、电子印章等。以下是基于 Vue 的实现方法: 使用 canvas 实现手写签名 安装依赖(如需要): npm install signature…