当前位置:首页 > VUE

vue 实现筛选

2026-02-10 06:19:41VUE

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>

使用 v-for 和 v-if 结合实现筛选

虽然不推荐在同一元素上同时使用 v-for 和 v-if,但可以通过包裹元素实现筛选。

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

使用第三方库实现高级筛选

对于更复杂的筛选需求,可以使用 lodash 等工具库。

import _ from 'lodash'

export default {
  data() {
    return {
      searchQuery: '',
      items: [
        { id: 1, name: 'Apple', category: 'fruit' },
        { id: 2, name: 'Banana', category: 'fruit' },
        { id: 3, name: 'Carrot', category: 'vegetable' }
      ],
      selectedCategory: ''
    }
  },
  computed: {
    filteredItems() {
      let result = this.items
      if (this.searchQuery) {
        result = _.filter(result, item => 
          item.name.toLowerCase().includes(this.searchQuery.toLowerCase())
        )
      }
      if (this.selectedCategory) {
        result = _.filter(result, { category: this.selectedCategory })
      }
      return result
    }
  }
}

使用 Vuex 管理筛选状态

在大型应用中,可以使用 Vuex 集中管理筛选状态。

// store.js
export default new Vuex.Store({
  state: {
    items: [...],
    filters: {
      searchQuery: '',
      category: ''
    }
  },
  getters: {
    filteredItems: state => {
      return state.items.filter(item => {
        const matchesSearch = item.name.toLowerCase()
          .includes(state.filters.searchQuery.toLowerCase())
        const matchesCategory = !state.filters.category || 
          item.category === state.filters.category
        return matchesSearch && matchesCategory
      })
    }
  }
})

使用自定义筛选指令

对于需要复用的筛选逻辑,可以创建自定义指令。

vue 实现筛选

Vue.directive('filter', {
  bind(el, binding, vnode) {
    const filterFn = binding.value
    const items = vnode.context.items
    vnode.context.filteredItems = items.filter(filterFn)
  },
  update(el, binding, vnode) {
    const filterFn = binding.value
    const items = vnode.context.items
    vnode.context.filteredItems = items.filter(filterFn)
  }
})

每种方法都有其适用场景,计算属性方式适合大多数简单筛选需求,而 Vuex 方案更适合大型应用的状态管理。根据项目复杂度和需求选择最合适的方法。

标签: vue
分享给朋友:

相关文章

实现 vue ssr

实现 vue ssr

Vue SSR 实现方法 Vue SSR(Server-Side Rendering)通过服务器端渲染 Vue 应用,提升首屏加载速度和 SEO 友好性。以下是核心实现方法: 基础配置 安装必要依赖…

代码实现vue

代码实现vue

创建Vue项目 使用Vue CLI快速初始化项目,确保已安装Node.js和npm/yarn: npm install -g @vue/cli vue create my-vue-project c…

jq 实现 vue

jq 实现 vue

jq 实现 Vue 的核心功能 jq 是一个轻量级的 JavaScript 库,主要用于 DOM 操作和事件处理。虽然它不能完全替代 Vue,但可以通过一些技巧模拟 Vue 的核心功能,如数据绑定、事…

vue实现grid

vue实现grid

Vue 实现 Grid 布局的方法 使用 CSS Grid 布局 Vue 可以结合 CSS Grid 布局实现灵活的网格系统。CSS Grid 是现代浏览器原生支持的布局方案,无需额外依赖库。 &l…

vue实现开关

vue实现开关

Vue 实现开关组件的方法 使用原生HTML和Vue数据绑定 通过v-model绑定复选框的checked状态,结合CSS样式实现开关效果: <template> <label…

vue实现浮标

vue实现浮标

Vue 实现浮动按钮(浮标) 使用 Vue 实现浮动按钮可以通过多种方式完成,以下是几种常见的方法: 使用 CSS 定位和 Vue 组件 创建 Vue 组件并配合 CSS 固定定位实现浮动按钮:…