当前位置:首页 > VUE

vue实现搜索框

2026-02-19 10:47:47VUE

实现基础搜索框

在Vue中创建一个基础搜索框需要绑定输入框的值到data属性,并使用计算属性或方法过滤数据。

<template>
  <div>
    <input v-model="searchQuery" placeholder="搜索..." />
    <ul>
      <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: '苹果' },
        { id: 2, name: '香蕉' },
        { id: 3, name: '橙子' }
      ]
    }
  },
  computed: {
    filteredItems() {
      return this.items.filter(item => 
        item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
      )
    }
  }
}
</script>

添加防抖优化

频繁触发搜索会影响性能,可以使用lodash的debounce方法或自定义防抖函数。

import _ from 'lodash'

export default {
  data() {
    return {
      searchQuery: '',
      items: [...],
      filteredItems: []
    }
  },
  watch: {
    searchQuery: _.debounce(function(newVal) {
      this.filteredItems = this.items.filter(item =>
        item.name.toLowerCase().includes(newVal.toLowerCase())
      )
    }, 500)
  }
}

异步搜索实现

当需要从API获取搜索结果时,可以使用async/await处理异步请求。

export default {
  methods: {
    async searchItems() {
      try {
        const response = await axios.get('/api/items', {
          params: { q: this.searchQuery }
        })
        this.filteredItems = response.data
      } catch (error) {
        console.error('搜索出错:', error)
      }
    }
  },
  watch: {
    searchQuery: _.debounce(function() {
      this.searchItems()
    }, 500)
  }
}

高级搜索功能

实现多条件搜索可以通过扩展搜索对象和逻辑。

<input v-model="searchParams.name" placeholder="名称" />
<input v-model="searchParams.category" placeholder="类别" />
export default {
  data() {
    return {
      searchParams: {
        name: '',
        category: ''
      },
      items: [...]
    }
  },
  computed: {
    filteredItems() {
      return this.items.filter(item => {
        const nameMatch = item.name.toLowerCase()
          .includes(this.searchParams.name.toLowerCase())
        const categoryMatch = item.category.toLowerCase()
          .includes(this.searchParams.category.toLowerCase())
        return nameMatch && categoryMatch
      })
    }
  }
}

使用Vuex管理搜索状态

在大型应用中,可以使用Vuex集中管理搜索状态和逻辑。

// store.js
export default new Vuex.Store({
  state: {
    searchQuery: '',
    items: [...]
  },
  getters: {
    filteredItems: state => {
      return state.items.filter(item =>
        item.name.toLowerCase().includes(state.searchQuery.toLowerCase())
      )
    }
  },
  mutations: {
    updateSearchQuery(state, query) {
      state.searchQuery = query
    }
  }
})
<template>
  <input 
    :value="searchQuery" 
    @input="updateSearchQuery($event.target.value)" 
    placeholder="搜索..."
  />
</template>

<script>
import { mapState, mapMutations } from 'vuex'

export default {
  computed: {
    ...mapState(['searchQuery']),
    ...mapGetters(['filteredItems'])
  },
  methods: {
    ...mapMutations(['updateSearchQuery'])
  }
}
</script>

样式优化

为搜索框添加基础样式提升用户体验。

vue实现搜索框

.search-box {
  padding: 8px 12px;
  border: 1px solid #ddd;
  border-radius: 4px;
  width: 300px;
  font-size: 16px;
}

.search-box:focus {
  outline: none;
  border-color: #409eff;
  box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.2);
}

标签: vue
分享给朋友:

相关文章

vue实现文章锚点定位

vue实现文章锚点定位

实现文章锚点定位的方法 在Vue中实现文章锚点定位可以通过多种方式完成,以下是几种常见的方法: 使用原生HTML锚点 通过HTML的id属性和<a>标签的href属性实现锚点跳转。在Vu…

vue实现app

vue实现app

Vue 实现 App 的常见方法 使用 Vue 开发移动端 App 主要有两种主流方案:混合开发(Hybrid)和原生渲染。以下是具体实现方式和工具链: 混合开发方案(WebView 嵌入) 通过…

vue compile 实现

vue compile 实现

Vue 编译实现原理 Vue 的编译过程将模板字符串转换为渲染函数,主要分为解析、优化和代码生成三个阶段。 解析阶段(Parse) 将模板字符串转换为抽象语法树(AST)。Vue 使用正则表达式和有…

vue实现flvvideo

vue实现flvvideo

vue-flv-player 实现 FLV 视频播放 安装依赖包 npm install flv.js vue-flv-player 基础组件引入 <template> <v…

vue实现拖拉

vue实现拖拉

实现拖拽功能的基本步骤 在Vue中实现拖拽功能可以通过原生HTML5的拖放API或第三方库如vuedraggable完成。以下是两种方法的详细说明。 使用HTML5原生拖放API HTML5提供了原…

vue实现tabs

vue实现tabs

Vue实现Tabs组件的方法 使用动态组件和v-for指令 在Vue中创建Tabs组件可以通过动态组件和v-for指令实现。定义一个包含tab标题和内容的数组,使用v-for渲染tab标题,并通过点击…