当前位置:首页 > VUE

vue实现列表的过滤

2026-01-21 05:23:04VUE

实现列表过滤的方法

在Vue中实现列表过滤通常可以通过计算属性、方法或第三方库如lodash来完成。以下是几种常见的实现方式:

使用计算属性过滤列表

计算属性是Vue中处理数据过滤的理想选择,因为它们会自动缓存结果,只在依赖项变化时重新计算。

<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>

使用方法过滤列表

如果过滤逻辑需要参数或更复杂,可以使用方法代替计算属性。

<template>
  <div>
    <input v-model="searchQuery" placeholder="搜索...">
    <ul>
      <li v-for="item in filterItems(searchQuery)" :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: '橙子' }
      ]
    }
  },
  methods: {
    filterItems(query) {
      return this.items.filter(item =>
        item.name.toLowerCase().includes(query.toLowerCase())
      )
    }
  }
}
</script>

使用lodash进行高级过滤

对于更复杂的过滤需求,可以使用lodash的_.filter_.debounce函数。

<template>
  <div>
    <input v-model="searchQuery" placeholder="搜索...">
    <ul>
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
  </div>
</template>

<script>
import _ from 'lodash'

export default {
  data() {
    return {
      searchQuery: '',
      items: [
        { id: 1, name: '苹果', category: '水果' },
        { id: 2, name: '胡萝卜', category: '蔬菜' },
        { id: 3, name: '橙子', category: '水果' }
      ]
    }
  },
  computed: {
    filteredItems() {
      return _.filter(this.items, item => {
        return item.name.toLowerCase().includes(this.searchQuery.toLowerCase()) &&
               item.category === '水果'
      })
    }
  }
}
</script>

使用watch和debounce优化性能

当过滤操作可能消耗较多资源时,可以使用watch配合debounce来优化性能。

<template>
  <div>
    <input v-model="searchQuery" placeholder="搜索...">
    <ul>
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
  </div>
</template>

<script>
import _ from 'lodash'

export default {
  data() {
    return {
      searchQuery: '',
      filteredItems: [],
      items: [
        { id: 1, name: '苹果' },
        { id: 2, name: '香蕉' },
        { id: 3, name: '橙子' }
      ]
    }
  },
  watch: {
    searchQuery: _.debounce(function(newVal) {
      this.filteredItems = this.items.filter(item =>
        item.name.toLowerCase().includes(newVal.toLowerCase())
      )
    }, 300)
  },
  created() {
    this.filteredItems = this.items
  }
}
</script>

多条件过滤的实现

对于需要多个过滤条件的场景,可以组合多个计算属性或方法。

<template>
  <div>
    <input v-model="nameQuery" placeholder="按名称搜索...">
    <input v-model="categoryQuery" placeholder="按类别搜索...">
    <ul>
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }} ({{ item.category }})
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      nameQuery: '',
      categoryQuery: '',
      items: [
        { id: 1, name: '苹果', category: '水果' },
        { id: 2, name: '胡萝卜', category: '蔬菜' },
        { id: 3, name: '橙子', category: '水果' }
      ]
    }
  },
  computed: {
    filteredItems() {
      return this.items.filter(item => {
        const nameMatch = item.name.toLowerCase().includes(this.nameQuery.toLowerCase())
        const categoryMatch = item.category.toLowerCase().includes(this.categoryQuery.toLowerCase())
        return nameMatch && categoryMatch
      })
    }
  }
}
</script>

服务器端过滤

对于大型数据集,可能需要将过滤逻辑移到服务器端。

vue实现列表的过滤

<template>
  <div>
    <input v-model="searchQuery" placeholder="搜索..." @input="fetchFilteredItems">
    <ul>
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
  </div>
</template>

<script>
import axios from 'axios'

export default {
  data() {
    return {
      searchQuery: '',
      filteredItems: []
    }
  },
  methods: {
    fetchFilteredItems: _.debounce(async function() {
      try {
        const response = await axios.get('/api/items', {
          params: { search: this.searchQuery }
        })
        this.filteredItems = response.data
      } catch (error) {
        console.error('获取数据失败:', error)
      }
    }, 300)
  },
  async created() {
    await this.fetchFilteredItems()
  }
}
</script>

以上方法涵盖了Vue中实现列表过滤的常见场景,从简单的客户端过滤到复杂的服务器端过滤,开发者可以根据具体需求选择最适合的方案。

标签: 列表vue
分享给朋友:

相关文章

vue 实现拖动

vue 实现拖动

Vue 实现拖动的几种方法 在Vue中实现拖动功能可以通过多种方式,包括原生HTML5的拖放API、第三方库如vuedraggable等。以下是几种常见的实现方法: 使用HTML5拖放API HTM…

vue实现系统

vue实现系统

Vue 实现系统的核心方法 使用 Vue.js 构建系统时,需结合其响应式特性与组件化开发模式。以下为关键实现路径: 项目初始化与工程配置 通过 Vue CLI 或 Vite 创建项目骨架,推荐选择…

vue模版实现

vue模版实现

Vue 模板实现方法 Vue 模板是 Vue.js 的核心特性之一,用于声明式地将 DOM 绑定至底层 Vue 实例的数据。以下是几种常见的 Vue 模板实现方式: 单文件组件(SFC) 使用 .v…

vue实现烟花

vue实现烟花

Vue 实现烟花效果 在 Vue 中实现烟花效果可以通过结合 CSS 动画和 JavaScript 动态生成烟花元素。以下是具体实现方法: 动态生成烟花元素 通过 Vue 的 v-for 动态生成烟…

vue实现首页

vue实现首页

Vue 实现首页的基本步骤 安装 Vue.js 和相关依赖,可以通过 Vue CLI 或 Vite 快速初始化项目。Vue CLI 适合传统项目,Vite 更适合现代前端开发。 npm instal…

vue日历实现

vue日历实现

实现基础日历布局 使用Vue的模板语法构建日历的基本HTML结构。一个典型的日历包含星期标题和日期格子,可以通过v-for循环生成。月份切换功能通过计算属性动态更新日期数组。 <templat…