当前位置:首页 > VUE

vue实现搜索功能demo

2026-02-24 09:52:11VUE

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

vue实现搜索功能demo

基础实现代码

<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>

关键点说明:

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

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

vue实现搜索功能demo

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

相关文章

eventbus vue实现

eventbus vue实现

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

vue 实现直播

vue 实现直播

Vue 实现直播的基本方法 在Vue中实现直播功能,通常需要结合WebRTC、RTMP或HLS等技术。以下是几种常见的实现方式: 使用WebRTC实现实时直播 WebRTC适合低延迟的实时直播场景,…

vue实现$.extend

vue实现$.extend

Vue 实现类似 jQuery 的 $.extend 功能 在 Vue 中实现类似 jQuery 的 $.extend 功能,可以通过多种方式完成。$.extend 主要用于合并多个对象的属性,Vue…

实现简易vue

实现简易vue

实现简易 Vue 的核心思路 Vue 的核心功能包括数据响应式、模板编译和虚拟 DOM。以下是一个简易实现方案,涵盖核心功能模块。 数据响应式系统 通过 Object.defineProperty…

vue实现粘贴

vue实现粘贴

Vue 实现粘贴功能的方法 在 Vue 中实现粘贴功能通常涉及监听粘贴事件并处理剪贴板数据。以下是几种常见的实现方式: 监听原生粘贴事件 通过 @paste 指令或原生 addEventListe…

vue 实现表单

vue 实现表单

Vue 表单实现方法 Vue.js 提供了多种方式实现表单,包括双向数据绑定、表单验证和动态表单生成。以下是常见的实现方法: 基础表单绑定 使用 v-model 指令实现表单元素与数据的双向绑定:…