当前位置:首页 > VUE

用vue实现搜索查询

2026-03-26 23:59:19VUE

实现搜索查询功能

在Vue中实现搜索查询功能通常涉及以下几个关键步骤。以下是一个基于Vue 3和Composition API的示例:

数据绑定与输入处理

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

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

const searchQuery = ref('');
</script>

v-model实现了输入框与searchQuery变量的双向绑定,用户输入内容会自动更新到变量中。

用vue实现搜索查询

过滤数据列表

<template>
  <input v-model="searchQuery" placeholder="搜索..." />
  <ul>
    <li v-for="item in filteredItems" :key="item.id">
      {{ item.name }}
    </li>
  </ul>
</template>

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

const searchQuery = ref('');
const items = ref([
  { id: 1, name: '苹果' },
  { id: 2, name: '香蕉' },
  { id: 3, name: '橙子' }
]);

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

使用computed属性创建响应式的过滤列表,当searchQuery变化时自动重新计算。

添加防抖优化

对于频繁触发的搜索,可以添加防抖功能:

用vue实现搜索查询

<script setup>
import { ref, computed } from 'vue';
import { useDebounceFn } from '@vueuse/core';

const searchQuery = ref('');
const debouncedSearch = useDebounceFn((value) => {
  // 这里可以调用API或执行其他搜索逻辑
  console.log('搜索:', value);
}, 500);
</script>

使用VueUse的useDebounceFn可以避免频繁触发搜索操作。

远程搜索实现

对于需要调用API的远程搜索:

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

const searchQuery = ref('');
const searchResults = ref([]);

const searchRemote = async () => {
  try {
    const response = await axios.get('/api/search', {
      params: { q: searchQuery.value }
    });
    searchResults.value = response.data;
  } catch (error) {
    console.error('搜索出错:', error);
  }
};
</script>

完整组件示例

<template>
  <div class="search-container">
    <input 
      v-model="searchQuery" 
      @input="handleSearch"
      placeholder="输入搜索关键词..."
    />

    <div v-if="isLoading">加载中...</div>

    <ul v-else>
      <li v-for="result in searchResults" :key="result.id">
        {{ result.title }}
      </li>
      <li v-if="searchResults.length === 0 && searchQuery">
        没有找到相关结果
      </li>
    </ul>
  </div>
</template>

<script setup>
import { ref } from 'vue';
import { useDebounceFn } from '@vueuse/core';
import axios from 'axios';

const searchQuery = ref('');
const searchResults = ref([]);
const isLoading = ref(false);

const searchRemote = async (query) => {
  if (!query.trim()) {
    searchResults.value = [];
    return;
  }

  isLoading.value = true;
  try {
    const response = await axios.get('/api/search', {
      params: { q: query }
    });
    searchResults.value = response.data;
  } catch (error) {
    console.error('搜索出错:', error);
  } finally {
    isLoading.value = false;
  }
};

const debouncedSearch = useDebounceFn(searchRemote, 500);

const handleSearch = () => {
  debouncedSearch(searchQuery.value);
};
</script>

<style scoped>
.search-container {
  max-width: 600px;
  margin: 0 auto;
}
input {
  width: 100%;
  padding: 8px;
  font-size: 16px;
}
ul {
  list-style: none;
  padding: 0;
}
li {
  padding: 8px;
  border-bottom: 1px solid #eee;
}
</style>

关键点说明

  • 使用v-model实现输入框双向绑定
  • 本地搜索使用computed属性实现响应式过滤
  • 远程搜索配合防抖函数避免频繁请求
  • 添加加载状态和空结果提示提升用户体验
  • 样式隔离确保组件独立性

以上实现可以根据实际需求进行调整,例如添加搜索历史、高亮匹配文本等增强功能。

标签: vue
分享给朋友:

相关文章

vue插槽实现

vue插槽实现

插槽的基本概念 Vue插槽(Slot)是一种内容分发机制,允许父组件向子组件传递模板片段,子组件通过<slot>标签定义接收位置。插槽的核心作用是增强组件的灵活性和复用性。 默认插槽 子…

vue实现答辩

vue实现答辩

Vue 实现答辩系统的关键步骤 项目初始化与配置 使用 Vue CLI 或 Vite 创建项目,安装 Vue Router 管理路由,Pinia/Vuex 进行状态管理。配置 ESLint 和 Pre…

vue实现treeselect

vue实现treeselect

Vue TreeSelect 实现方法 使用 Vue 实现 TreeSelect 组件可以通过以下几种方式完成,包括使用现成的第三方库或自行封装组件。 使用第三方库 推荐使用成熟的第三方 TreeS…

vue实现导出表格

vue实现导出表格

Vue 中实现表格导出 使用 xlsx 库导出 Excel 安装 xlsx 库: npm install xlsx --save 在 Vue 组件中引入并使用: import XLSX from…

vue怎么实现空格

vue怎么实现空格

在 Vue 中实现空格的方法 使用 HTML 实体或 JavaScript 方法 在 Vue 模板中可以直接使用 HTML 的空格实体 &nbsp; 或 Unicode 空格字符 \u00A0…

vue实现适老化样式

vue实现适老化样式

Vue 实现适老化样式的关键方法 使用大字体和高对比度 在全局 CSS 或组件样式中设置基础字号为 16px 以上,推荐 18-20px。通过 CSS 变量控制字体大小,便于全局调整: :root…