当前位置:首页 > VUE

vue实现search组件

2026-03-09 02:51:46VUE

Vue 实现 Search 组件

基础搜索组件实现

创建基础的搜索输入框,包含输入事件和清除功能:

<template>
  <div class="search-container">
    <input
      v-model="searchQuery"
      @input="handleSearch"
      placeholder="Search..."
      class="search-input"
    />
    <button v-if="searchQuery" @click="clearSearch" class="clear-button">
      ×
    </button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: ''
    }
  },
  methods: {
    handleSearch() {
      this.$emit('search', this.searchQuery)
    },
    clearSearch() {
      this.searchQuery = ''
      this.$emit('search', '')
    }
  }
}
</script>

<style>
.search-container {
  position: relative;
  display: inline-block;
}
.search-input {
  padding: 8px 12px;
  border: 1px solid #ddd;
  border-radius: 4px;
  width: 200px;
}
.clear-button {
  position: absolute;
  right: 8px;
  top: 50%;
  transform: translateY(-50%);
  background: none;
  border: none;
  cursor: pointer;
}
</style>

防抖优化

添加防抖功能避免频繁触发搜索:

import { debounce } from 'lodash'

export default {
  data() {
    return {
      searchQuery: '',
      debouncedSearch: null
    }
  },
  created() {
    this.debouncedSearch = debounce(this.emitSearch, 300)
  },
  methods: {
    handleSearch() {
      this.debouncedSearch()
    },
    emitSearch() {
      this.$emit('search', this.searchQuery)
    }
  }
}

异步搜索建议

实现带有搜索建议的组件:

<template>
  <div class="search-suggestions">
    <input
      v-model="searchQuery"
      @input="handleSearch"
      @focus="showSuggestions = true"
      @blur="hideSuggestions"
      placeholder="Search..."
    />
    <ul v-if="showSuggestions && suggestions.length">
      <li
        v-for="(item, index) in suggestions"
        :key="index"
        @mousedown="selectSuggestion(item)"
      >
        {{ item }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      suggestions: [],
      showSuggestions: false
    }
  },
  methods: {
    async handleSearch() {
      if (this.searchQuery.length > 2) {
        const response = await fetch(`/api/search?q=${this.searchQuery}`)
        this.suggestions = await response.json()
      } else {
        this.suggestions = []
      }
    },
    selectSuggestion(item) {
      this.searchQuery = item
      this.showSuggestions = false
      this.$emit('search', item)
    },
    hideSuggestions() {
      setTimeout(() => {
        this.showSuggestions = false
      }, 200)
    }
  }
}
</script>

高级搜索功能

实现多条件筛选搜索:

<template>
  <div class="advanced-search">
    <input
      v-model="searchParams.keyword"
      placeholder="Keyword"
      @input="search"
    />
    <select v-model="searchParams.category" @change="search">
      <option value="">All Categories</option>
      <option v-for="cat in categories" :value="cat.id" :key="cat.id">
        {{ cat.name }}
      </option>
    </select>
    <input
      type="date"
      v-model="searchParams.startDate"
      @change="search"
    />
    <input
      type="date"
      v-model="searchParams.endDate"
      @change="search"
    />
  </div>
</template>

<script>
export default {
  props: {
    categories: {
      type: Array,
      default: () => []
    }
  },
  data() {
    return {
      searchParams: {
        keyword: '',
        category: '',
        startDate: '',
        endDate: ''
      }
    }
  },
  methods: {
    search() {
      this.$emit('search', this.searchParams)
    }
  }
}
</script>

集成Vuex

与Vuex集成的搜索组件:

<template>
  <input
    v-model="searchQuery"
    @input="updateSearchQuery"
    placeholder="Search..."
  />
</template>

<script>
import { mapActions } from 'vuex'

export default {
  computed: {
    searchQuery: {
      get() {
        return this.$store.state.search.query
      },
      set(value) {
        this.setSearchQuery(value)
      }
    }
  },
  methods: {
    ...mapActions(['setSearchQuery', 'search']),
    updateSearchQuery() {
      this.search(this.searchQuery)
    }
  }
}
</script>

样式优化

添加现代UI风格的搜索组件:

vue实现search组件

<template>
  <div class="modern-search">
    <div class="search-icon">🔍</div>
    <input
      v-model="searchQuery"
      @input="handleSearch"
      placeholder="Search anything..."
    />
  </div>
</template>

<style>
.modern-search {
  display: flex;
  align-items: center;
  background: #f5f5f5;
  border-radius: 24px;
  padding: 8px 16px;
  width: 300px;
}
.modern-search input {
  border: none;
  background: transparent;
  padding: 8px;
  width: 100%;
  outline: none;
}
.search-icon {
  margin-right: 8px;
  opacity: 0.5;
}
</style>

这些实现方案覆盖了从基础到高级的搜索组件需求,可以根据具体项目需求选择合适的实现方式或组合使用多个功能。

标签: 组件vue
分享给朋友:

相关文章

vue如何实现冒泡

vue如何实现冒泡

Vue 实现冒泡排序 在 Vue 中实现冒泡排序,可以通过数据绑定和响应式特性动态展示排序过程。以下是一个完整的实现示例,包含代码和详细说明。 数据准备 在 Vue 的 data 中定义一个数组作为…

vue实现关键词轮播

vue实现关键词轮播

Vue 实现关键词轮播 基础实现方案 使用 Vue 的 v-for 和 setInterval 实现基础轮播效果: <template> <div class="keyword…

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

vue实现token

vue实现token

Vue 中实现 Token 认证的方法 在 Vue 中实现 Token 认证通常涉及前端与后端的交互,包括 Token 的获取、存储、发送和刷新等操作。以下是具体实现步骤: 获取 Token 用户登…

vue实现弹幕

vue实现弹幕

Vue 实现弹幕功能 弹幕功能通常包括动态生成、滚动显示、颜色和速度随机化等特性。以下是基于 Vue 3 的实现方法。 核心思路 使用 CSS 动画控制弹幕从右向左滚动。 动态生成弹幕数据,随机设置…

vue实现123456

vue实现123456

Vue 实现数字 123456 的显示 在 Vue 中显示数字 123456 非常简单,可以通过以下方法实现: 方法一:直接在模板中显示 <template> <div>…