当前位置:首页 > VUE

vue实现过滤

2026-02-10 01:03:52VUE

Vue实现过滤的方法

在Vue中实现过滤功能可以通过多种方式,包括计算属性、自定义过滤器、第三方库等。以下是几种常见的实现方法:

使用计算属性过滤数组

计算属性是Vue中处理数据过滤的理想选择,特别是当需要根据用户输入动态过滤数据时。

<template>
  <div>
    <input v-model="searchQuery" placeholder="Search...">
    <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: 'Apple' },
        { id: 2, name: 'Banana' },
        { id: 3, name: 'Orange' }
      ]
    }
  },
  computed: {
    filteredItems() {
      return this.items.filter(item => 
        item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
      )
    }
  }
}
</script>

使用自定义过滤器

Vue 2.x支持自定义过滤器,虽然Vue 3.x已移除该功能,但在Vue 2.x中仍可使用:

<template>
  <div>
    <ul>
      <li v-for="item in items | filterBy searchQuery" :key="item.id">
        {{ item.name }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      items: [
        { id: 1, name: 'Apple' },
        { id: 2, name: 'Banana' },
        { id: 3, name: 'Orange' }
      ]
    }
  },
  filters: {
    filterBy(list, query) {
      return list.filter(item => 
        item.name.toLowerCase().includes(query.toLowerCase())
      )
    }
  }
}
</script>

使用第三方库如lodash

对于更复杂的过滤需求,可以使用lodash等工具库:

<template>
  <div>
    <input v-model="searchQuery" placeholder="Search...">
    <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: 'Apple' },
        { id: 2, name: 'Banana' },
        { id: 3, name: 'Orange' }
      ]
    }
  },
  computed: {
    filteredItems() {
      return _.filter(this.items, item => 
        _.includes(item.name.toLowerCase(), this.searchQuery.toLowerCase())
      )
    }
  }
}
</script>

实现多条件过滤

对于需要多个过滤条件的场景,可以扩展计算属性:

<template>
  <div>
    <input v-model="filters.name" placeholder="Name...">
    <input v-model="filters.category" placeholder="Category...">
    <ul>
      <li v-for="item in filteredItems" :key="item.id">
        {{ item.name }} - {{ item.category }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      filters: {
        name: '',
        category: ''
      },
      items: [
        { id: 1, name: 'Apple', category: 'Fruit' },
        { id: 2, name: 'Carrot', category: 'Vegetable' },
        { id: 3, name: 'Orange', category: 'Fruit' }
      ]
    }
  },
  computed: {
    filteredItems() {
      return this.items.filter(item => {
        const nameMatch = item.name.toLowerCase().includes(
          this.filters.name.toLowerCase()
        )
        const categoryMatch = item.category.toLowerCase().includes(
          this.filters.category.toLowerCase()
        )
        return nameMatch && categoryMatch
      })
    }
  }
}
</script>

使用Vuex进行全局过滤

当应用状态管理使用Vuex时,可以在store中实现过滤逻辑:

// store.js
export default new Vuex.Store({
  state: {
    searchQuery: '',
    items: [
      { id: 1, name: 'Apple' },
      { id: 2, name: 'Banana' },
      { id: 3, name: 'Orange' }
    ]
  },
  getters: {
    filteredItems: state => {
      return state.items.filter(item => 
        item.name.toLowerCase().includes(state.searchQuery.toLowerCase())
      )
    }
  }
})

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

<script>
import { mapGetters, mapActions } from 'vuex'

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

使用v-show实现简单过滤

对于简单的显示/隐藏过滤,可以使用v-show指令:

vue实现过滤

<template>
  <div>
    <input v-model="searchQuery" placeholder="Search...">
    <ul>
      <li v-for="item in items" 
          :key="item.id" 
          v-show="item.name.toLowerCase().includes(searchQuery.toLowerCase())">
        {{ item.name }}
      </li>
    </ul>
  </div>
</template>

以上方法可以根据具体需求选择使用,计算属性是最常用且推荐的方式,特别是在Vue 3.x中。对于复杂应用,结合Vuex进行状态管理可以实现更灵活的过滤功能。

标签: vue
分享给朋友:

相关文章

vue页面分离的实现

vue页面分离的实现

Vue页面分离的实现方法 将Vue页面分离为多个组件或模块,有助于提升代码可维护性和复用性。以下是几种常见的实现方式: 组件化拆分 通过将页面拆分为多个子组件,每个组件负责特定功能或UI部分。使用i…

vue实现视窗

vue实现视窗

Vue 实现视窗功能 在 Vue 中实现视窗功能通常涉及监听浏览器窗口大小变化、响应式布局或创建自定义弹窗组件。以下是几种常见实现方式: 监听浏览器窗口大小变化 使用 Vue 的 mounted 和…

vue实现ai

vue实现ai

Vue 实现 AI 功能 Vue.js 可以通过集成第三方 AI 服务或本地 AI 模型来实现 AI 功能。以下是几种常见的方法: 集成第三方 AI API 使用 Vue 调用如 OpenAI、Go…

vue实现autocomplete

vue实现autocomplete

Vue 实现 Autocomplete 功能 Vue 中实现 Autocomplete(自动完成)功能可以通过自定义组件或使用现有库完成。以下是几种常见方法: 方法一:使用 Vue 原生实现 创建…

vue  select实现

vue select实现

Vue Select 实现方法 在 Vue 中实现下拉选择功能可以使用原生 <select> 标签或第三方库如 vue-select。以下是两种方法的详细说明: 原生 HTML Sele…

vue 实现直播

vue 实现直播

Vue 实现直播的基本方法 在Vue中实现直播功能,通常需要结合WebRTC、RTMP或HLS等技术。以下是几种常见的实现方式: 使用WebRTC实现实时直播 WebRTC适合低延迟的实时直播场景,…