当前位置:首页 > 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中实现表格的多行编辑功能,可以通过以下方法完成。这里以Element UI的表格组件为例,但思路适用于其他UI库或原生实现。 数据准备 定义表格数据和编辑状态管理变量:…

vue 实现菜单

vue 实现菜单

Vue 实现菜单的方法 使用 Vue 实现菜单可以通过多种方式,以下是几种常见的方法: 使用 Vue Router 实现动态路由菜单 通过 Vue Router 可以动态生成菜单,根据路由配置自动渲…

vue实现缩放

vue实现缩放

Vue 实现缩放的方法 在 Vue 中实现缩放功能可以通过多种方式完成,以下是一些常见的方法: 使用 CSS transform 属性 通过 CSS 的 transform: scale() 属性可…

vue实现swiper

vue实现swiper

Vue 中实现 Swiper 的方法 安装 Swiper 依赖 在 Vue 项目中安装 Swiper 和相关依赖: npm install swiper vue-awesome-swiper 全局引…

vue实现通讯

vue实现通讯

Vue 组件通讯方法 父子组件通讯 父组件向子组件传递数据通过 props,子组件向父组件传递数据通过 $emit 事件。 父组件模板: <child-component :message=…

vue实现树形

vue实现树形

Vue 实现树形组件 在 Vue 中实现树形结构通常需要递归组件和动态数据绑定。以下是实现树形组件的几种常见方法。 递归组件实现 递归组件是 Vue 中实现树形结构的核心方法。通过组件调用自身,可以…