当前位置:首页 > VUE

vue实现搜索框

2026-01-18 18:26:28VUE

Vue 实现搜索框的方法

基础实现:双向绑定与事件监听

在 Vue 中实现搜索框可以通过 v-model 实现数据双向绑定,结合 @input@keyup 事件监听用户输入:

<template>
  <div>
    <input 
      v-model="searchQuery" 
      @input="handleSearch" 
      placeholder="输入搜索内容"
    />
    <ul v-if="filteredItems.length">
      <li v-for="item in filteredItems" :key="item.id">{{ item.name }}</li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      items: [
        { id: 1, name: 'Apple' },
        { id: 2, name: 'Banana' }
      ]
    }
  },
  computed: {
    filteredItems() {
      return this.items.filter(item => 
        item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
      )
    }
  },
  methods: {
    handleSearch() {
      // 可在此处添加防抖逻辑
    }
  }
}
</script>

防抖优化性能

高频输入场景下建议添加防抖功能,避免频繁触发搜索逻辑:

import { debounce } from 'lodash-es';

methods: {
  handleSearch: debounce(function() {
    // 实际搜索逻辑
  }, 300)
}

异步搜索实现

需要调用 API 时可采用异步方式:

async handleSearch() {
  if (!this.searchQuery.trim()) return;

  try {
    const res = await axios.get('/api/search', {
      params: { q: this.searchQuery }
    });
    this.results = res.data;
  } catch (error) {
    console.error(error);
  }
}

样式增强建议

结合 CSS 实现现代搜索框样式:

vue实现搜索框

.search-box {
  padding: 8px 15px;
  border: 1px solid #ddd;
  border-radius: 20px;
  outline: none;
  transition: all 0.3s;
}
.search-box:focus {
  border-color: #4285f4;
  box-shadow: 0 0 5px rgba(66, 133, 244, 0.5);
}

完整组件示例

<template>
  <div class="search-container">
    <div class="search-box-wrapper">
      <input
        v-model="searchTerm"
        @input="onSearch"
        class="search-box"
        placeholder="搜索..."
      />
      <button @click="clearSearch">×</button>
    </div>

    <div v-if="isLoading">加载中...</div>
    <search-results :items="results" v-else-if="results.length"/>
  </div>
</template>

<script>
export default {
  data: () => ({
    searchTerm: '',
    results: [],
    isLoading: false,
    debounceTimer: null
  }),
  methods: {
    onSearch() {
      clearTimeout(this.debounceTimer);
      this.debounceTimer = setTimeout(() => {
        this.performSearch();
      }, 500);
    },
    async performSearch() {
      if (!this.searchTerm) {
        this.results = [];
        return;
      }

      this.isLoading = true;
      try {
        const response = await fetch(`/api/search?q=${encodeURIComponent(this.searchTerm)}`);
        this.results = await response.json();
      } finally {
        this.isLoading = false;
      }
    },
    clearSearch() {
      this.searchTerm = '';
      this.results = [];
    }
  }
};
</script>

标签: vue
分享给朋友:

相关文章

vue实现前端

vue实现前端

Vue 实现前端的核心方法与步骤 安装 Vue 项目 使用 Vue CLI 或 Vite 创建项目。Vue CLI 是传统构建工具,Vite 是新一代轻量级工具。 npm init vue@la…

vue代理实现

vue代理实现

Vue 代理实现方法 在 Vue 项目中,配置代理可以解决开发环境下的跨域问题,通常通过修改 vue.config.js 文件实现。以下是几种常见的代理配置方式: 基础代理配置 在 vue.conf…

vue如何实现

vue如何实现

Vue 实现方法 在 Vue 中实现功能通常涉及组件化开发、状态管理和响应式数据绑定。以下是几种常见的实现方式: 组件化开发 使用 Vue 的单文件组件(.vue 文件)结构,将 UI 拆分为可复用…

vue实现选择

vue实现选择

Vue 实现选择功能的方法 在 Vue 中实现选择功能可以通过多种方式完成,以下介绍几种常见的实现方法。 使用 v-model 绑定单选 通过 v-model 可以轻松实现单选功能。以下是一个简单的…

vue实现队列

vue实现队列

Vue 实现队列功能 在 Vue 中实现队列功能可以通过多种方式完成,以下是几种常见的方法: 使用数组模拟队列 队列遵循先进先出(FIFO)原则,可以用数组的 push 和 shift 方法模拟入队…

vue实现气泡

vue实现气泡

Vue 实现气泡效果的方法 在 Vue 中实现气泡效果可以通过 CSS 动画、第三方库或自定义组件完成。以下是几种常见实现方式: 使用纯 CSS 和 Vue 过渡 通过 Vue 的过渡系统结合 CS…