当前位置:首页 > 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. 多字段搜索

    vue3实现搜索

    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 攻击
  • 远程搜索建议添加加载状态和错误处理

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

分享给朋友:

相关文章

vue登录逻辑的实现

vue登录逻辑的实现

Vue 登录逻辑实现 前端实现 创建登录组件 在 Vue 项目中创建一个登录组件,通常命名为 Login.vue。该组件包含表单元素,如用户名和密码输入框,以及提交按钮。 <template&…

vue实现导航栏切图

vue实现导航栏切图

Vue 实现导航栏切图 使用 Vue Router 实现基础导航 在 Vue 项目中,可以通过 Vue Router 实现导航栏的路由切换。创建一个导航栏组件,并在其中使用 <router-li…

eventbus vue实现

eventbus vue实现

EventBus 实现原理 EventBus 是一种发布/订阅模式,用于 Vue 组件间的通信。核心是通过一个中央事件总线管理事件监听和触发。 创建 EventBus 在 Vue 项目中创建一个独立…

Vue界面实现

Vue界面实现

Vue 界面实现方法 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是实现 Vue 界面的常见方法和技术要点。 安装与项目初始化 使用 Vue CLI 或 Vite…

vue实现公告

vue实现公告

Vue 实现公告功能的方法 公告功能通常需要实现滚动展示、自动切换或固定显示的效果。以下是几种常见的实现方式: 使用 marquee 标签实现滚动公告 <template> &l…

vue实现翻译

vue实现翻译

Vue 实现翻译功能的方法 使用 i18n 插件实现多语言切换 安装 vue-i18n 插件: npm install vue-i18n 创建语言资源文件(如 en.json 和 zh.json):…