当前位置:首页 > VUE

vue实现搜索功能demo

2026-02-24 09:52:11VUE

以下是一个基于 Vue 3 的搜索功能实现示例,包含关键代码和逻辑说明:

基础实现代码

<template>
  <div>
    <input 
      v-model="searchQuery" 
      placeholder="输入关键词搜索" 
      @input="handleSearch"
    />
    <ul v-if="filteredItems.length">
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
    <p v-else>暂无匹配结果</p>
  </div>
</template>

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

const items = ref([
  { id: 1, name: 'Apple' },
  { id: 2, name: 'Banana' },
  { id: 3, name: 'Orange' }
]);

const searchQuery = ref('');

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

function handleSearch() {
  console.log('搜索词:', searchQuery.value);
}
</script>

优化搜索性能

添加防抖处理避免频繁触发搜索

import { debounce } from 'lodash';

const debouncedSearch = debounce(() => {
  console.log('防抖处理后的搜索:', searchQuery.value);
}, 500);

function handleSearch() {
  debouncedSearch();
}

异步搜索实现

const searchResults = ref([]);

async function fetchSearchResults(query) {
  try {
    const response = await fetch(`/api/search?q=${query}`);
    searchResults.value = await response.json();
  } catch (error) {
    console.error('搜索出错:', error);
  }
}

watch(searchQuery, (newVal) => {
  if (newVal.length > 2) {
    fetchSearchResults(newVal);
  }
});

样式增强

input {
  padding: 8px 12px;
  border: 1px solid #ddd;
  border-radius: 4px;
  width: 300px;
}

ul {
  list-style: none;
  padding: 0;
  margin-top: 10px;
}

li {
  padding: 8px;
  border-bottom: 1px solid #eee;
  cursor: pointer;
}

li:hover {
  background-color: #f5f5f5;
}

完整功能扩展

<template>
  <div class="search-container">
    <div class="search-box">
      <input
        v-model="searchQuery"
        placeholder="输入关键词搜索"
        @input="handleSearch"
        @focus="showSuggestions = true"
        @blur="hideSuggestions"
      />
      <button @click="clearSearch">清除</button>
    </div>

    <div v-if="showSuggestions" class="suggestions">
      <div v-if="isLoading" class="loading">搜索中...</div>
      <div v-else-if="!filteredItems.length" class="no-results">
        无匹配结果
      </div>
      <ul v-else>
        <li 
          v-for="item in filteredItems" 
          :key="item.id"
          @mousedown="selectItem(item)"
        >
          {{ item.name }}
        </li>
      </ul>
    </div>
  </div>
</template>

关键点说明:

vue实现搜索功能demo

  • 使用 v-model 实现双向绑定
  • computed 属性实现实时过滤
  • 防抖处理优化性能
  • 支持异步API搜索
  • 添加UI交互增强体验

可根据实际需求调整搜索逻辑和界面样式。

标签: 搜索功能vue
分享给朋友:

相关文章

vue实现详情

vue实现详情

Vue 实现详情页的常见方法 使用动态路由 在 Vue Router 中配置动态路由参数,通过 $route.params 获取详情 ID。示例路由配置: { path: '/detail/:i…

vue 实现分屏

vue 实现分屏

Vue 实现分屏的方法 使用 CSS Flexbox 或 Grid 布局 通过 CSS Flexbox 或 Grid 布局可以轻松实现分屏效果。在 Vue 组件中定义两个或多个区域,并使用 CSS 控…

vue如何实现登录

vue如何实现登录

实现登录功能的基本步骤 使用Vue实现登录功能通常需要结合后端API、状态管理以及路由控制。以下是常见的实现方式: 创建登录表单组件 在Vue组件中构建包含用户名和密码输入框的表单: <te…

vue实现滚动监听

vue实现滚动监听

滚动监听的基本实现 在Vue中实现滚动监听可以通过原生JavaScript的window.addEventListener或结合Vue的生命周期钩子完成。以下是一个基础示例: export defa…

vue 左右滑动实现

vue 左右滑动实现

Vue 实现左右滑动功能 使用 Vue 实现左右滑动功能可以通过多种方式完成,常见的有基于原生 JavaScript 事件监听、第三方库(如 Hammer.js)或 Vue 专用插件(如 vue-to…

vue实现总金额

vue实现总金额

Vue 实现总金额计算 在 Vue 中实现总金额计算通常涉及数据绑定、计算属性和方法的使用。以下是几种常见的实现方式: 使用计算属性 计算属性是 Vue 中最适合处理动态计算的特性之一。通过计算属性…