当前位置:首页 > VUE

vue实现搜索筛选

2026-03-29 22:36:09VUE

实现搜索筛选的基本思路

在Vue中实现搜索筛选功能通常需要结合v-model绑定输入框数据,通过计算属性或方法动态过滤列表数据。核心逻辑包括数据绑定、过滤条件和渲染展示。

数据准备与绑定

  1. 定义数据 在Vue组件的data中初始化列表数据和搜索关键词:

    data() {
      return {
        searchQuery: '',
        items: [
          { id: 1, name: 'Apple', category: 'Fruit' },
          { id: 2, name: 'Carrot', category: 'Vegetable' }
        ]
      }
    }
  2. 绑定输入框 使用v-model实现双向绑定:

    <input v-model="searchQuery" placeholder="Search...">

实现筛选逻辑

  1. 计算属性过滤 通过computed属性动态计算筛选结果,避免直接修改原数据:

    vue实现搜索筛选

    computed: {
      filteredItems() {
        return this.items.filter(item => 
          item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
        )
      }
    }
  2. 多条件筛选 若需支持多字段筛选,可扩展过滤逻辑:

    filteredItems() {
      const query = this.searchQuery.toLowerCase()
      return this.items.filter(item =>
        item.name.toLowerCase().includes(query) ||
        item.category.toLowerCase().includes(query)
      )
    }

渲染筛选结果

  1. 列表渲染 使用v-for绑定计算后的结果:

    vue实现搜索筛选

    <ul>
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }} ({{ item.category }})
      </li>
    </ul>
  2. 空状态处理 添加无结果时的提示:

    <p v-if="filteredItems.length === 0">No matching items found.</p>

高级优化

  1. 防抖处理 通过lodash.debounce减少频繁触发:

    methods: {
      handleSearch: _.debounce(function(query) {
        this.searchQuery = query
      }, 300)
    }
  2. 分页支持 结合分页组件控制显示范围:

    computed: {
      paginatedItems() {
        const start = (this.currentPage - 1) * this.pageSize
        return this.filteredItems.slice(start, start + this.pageSize)
      }
    }

完整示例代码

<template>
  <div>
    <input 
      v-model="searchQuery" 
      placeholder="Search by name or category"
    >
    <ul v-if="filteredItems.length">
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }} - {{ item.category }}
      </li>
    </ul>
    <p v-else>No results found.</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      items: [
        /* 原始数据 */
      ]
    }
  },
  computed: {
    filteredItems() {
      const query = this.searchQuery.toLowerCase()
      return this.items.filter(item =>
        item.name.toLowerCase().includes(query) ||
        item.category.toLowerCase().includes(query)
      )
    }
  }
}
</script>

标签: vue
分享给朋友:

相关文章

vue实现文字播放栏

vue实现文字播放栏

Vue 实现文字播放栏(跑马灯效果) 方法一:使用 CSS 动画 + Vue 数据绑定 通过 CSS 的 @keyframes 实现动画效果,结合 Vue 的动态数据绑定控制内容。 <tem…

vue实现上移下移插件

vue实现上移下移插件

实现上移下移功能的 Vue 插件 在 Vue 中实现列表项的上移和下移功能,可以通过自定义指令或组件封装的方式完成。以下是两种常见实现方式: 基于数组操作的通用方法 通过操作数组索引实现元素位置交换…

vue 实现fadeout

vue 实现fadeout

Vue 实现淡出效果 在 Vue 中实现淡出(fade-out)效果可以通过 CSS 过渡或动画结合 Vue 的动态渲染功能完成。以下是几种常见方法: 使用 Vue 过渡(Transition)组件…

vue实现slidetoggle

vue实现slidetoggle

Vue 实现 SlideToggle 效果 SlideToggle 是一种常见的交互效果,元素以滑动方式展开或收起。以下是几种实现方法: 使用 CSS Transition 和 v-show…

vue 实现拖拉

vue 实现拖拉

Vue 实现拖拽功能的方法 使用 HTML5 原生拖放 API HTML5 提供了原生的拖放 API,可以通过 draggable 属性、dragstart、dragend、dragover 和 dr…

vue实现链接

vue实现链接

Vue 实现链接的方法 在 Vue 中实现链接可以通过多种方式,包括使用 <router-link>、<a> 标签或编程式导航。以下是几种常见的方法: 使用 <rout…