当前位置:首页 > VUE

用vue实现搜索查询

2026-01-12 02:24:01VUE

使用 Vue 实现搜索查询功能

数据绑定与输入框

在 Vue 中实现搜索功能,首先需要创建一个输入框,并通过 v-model 实现双向数据绑定。以下是一个基础模板示例:

<template>
  <div>
    <input 
      type="text" 
      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>

数据处理与计算属性

data 中定义搜索关键词和原始数据列表,通过计算属性 filteredItems 动态过滤结果:

<script>
export default {
  data() {
    return {
      searchQuery: '',
      items: [
        { id: 1, name: '苹果' },
        { id: 2, name: '香蕉' },
        { id: 3, name: '橙子' }
      ]
    };
  },
  computed: {
    filteredItems() {
      return this.items.filter(item =>
        item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
      );
    }
  }
};
</script>

防抖优化(可选)

频繁触发搜索时,可以通过防抖(debounce)减少计算压力。使用 Lodash 或手动实现:

methods: {
  handleSearch: _.debounce(function() {
    this.filteredItems = this.items.filter(item =>
      item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
    );
  }, 300)
}

异步搜索(API 请求)

如果需要从后端获取搜索结果,可使用 axiosfetch

methods: {
  async handleSearch() {
    if (!this.searchQuery.trim()) return;
    try {
      const response = await axios.get('/api/search', {
        params: { q: this.searchQuery }
      });
      this.filteredItems = response.data;
    } catch (error) {
      console.error('搜索失败:', error);
    }
  }
}

样式与交互增强

添加加载状态和错误提示提升用户体验:

<template>
  <div>
    <input 
      type="text" 
      v-model="searchQuery" 
      @input="handleSearch" 
    />
    <p v-if="loading">搜索中...</p>
    <p v-if="error">{{ error }}</p>
    <ul v-else-if="filteredItems.length">
      <li v-for="item in filteredItems" :key="item.id">{{ item.name }}</li>
    </ul>
  </div>
</template>

完整示例代码

<template>
  <div class="search-container">
    <input
      type="text"
      v-model="searchQuery"
      placeholder="输入关键词"
      @input="handleSearch"
    />
    <div v-if="loading">加载中...</div>
    <ul v-else-if="filteredItems.length">
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
    <div v-else>未找到匹配项</div>
  </div>
</template>

<script>
import axios from 'axios';
import _ from 'lodash';

export default {
  data() {
    return {
      searchQuery: '',
      items: [],
      loading: false,
      error: null
    };
  },
  computed: {
    filteredItems() {
      return this.items.filter(item =>
        item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
      );
    }
  },
  methods: {
    handleSearch: _.debounce(async function() {
      if (!this.searchQuery.trim()) {
        this.items = [];
        return;
      }
      this.loading = true;
      try {
        const response = await axios.get('/api/search', {
          params: { q: this.searchQuery }
        });
        this.items = response.data;
        this.error = null;
      } catch (err) {
        this.error = '搜索失败,请重试';
      } finally {
        this.loading = false;
      }
    }, 500)
  }
};
</script>

用vue实现搜索查询

标签: vue
分享给朋友:

相关文章

vue实现tab标签

vue实现tab标签

Vue 实现 Tab 标签的方法 使用动态组件和 v-for 渲染标签 通过 v-for 循环生成标签页标题,结合 v-bind:class 动态切换激活状态。使用 v-show 或动态组件 <…

vue表单实现搜索

vue表单实现搜索

实现Vue表单搜索功能 在Vue中实现表单搜索功能通常涉及表单绑定、事件处理和搜索逻辑。以下是具体实现方法: 数据绑定与表单结构 使用v-model实现表单与Vue数据的双向绑定: <t…

vue页面分离的实现

vue页面分离的实现

Vue页面分离的实现方法 将Vue页面分离为多个组件或模块,有助于提升代码可维护性和复用性。以下是几种常见的实现方式: 组件化拆分 通过将页面拆分为多个子组件,每个组件负责特定功能或UI部分。使用…

vue实现下拉层级

vue实现下拉层级

Vue实现下拉层级菜单 使用Vue实现下拉层级菜单可以通过递归组件或动态渲染的方式完成。以下是两种常见实现方法: 递归组件实现 创建一个递归组件处理多级菜单结构: <template>…

vue前端分页怎么实现

vue前端分页怎么实现

前端分页实现方法 在Vue中实现前端分页通常涉及数据分割和页面控制逻辑。以下是常见的实现方式: 使用计算属性分页 通过计算属性对数据进行切片处理: computed: { paginatedD…

vue实现多选题

vue实现多选题

Vue实现多选题的方法 使用Vue实现多选题功能,可以通过v-model绑定数组、动态渲染选项、以及处理选中状态来实现。以下是一个完整的实现示例: 基础实现代码 <template>…