当前位置:首页 > VUE

vue实现自动筛选

2026-01-19 14:26:33VUE

自动筛选实现方法

在Vue中实现自动筛选功能,可以通过计算属性、v-model指令和数组过滤方法结合完成。以下是具体实现方式:

基础实现

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 filteredItems" :key="item.id">
        {{ item.name }} - {{ item.description }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      items: [
        { id: 1, name: '苹果', description: '红色水果' },
        { id: 2, name: '香蕉', description: '黄色水果' },
        { id: 3, name: '橙子', description: '橙色水果' }
      ]
    }
  },
  computed: {
    filteredItems() {
      const query = this.searchQuery.toLowerCase()
      return this.items.filter(item => 
        item.name.toLowerCase().includes(query) || 
        item.description.toLowerCase().includes(query)
      )
    }
  }
}
</script>

高级筛选功能

使用debounce优化性能

vue实现自动筛选

<script>
import { debounce } from 'lodash'

export default {
  data() {
    return {
      searchQuery: '',
      items: [...],
      filteredItems: []
    }
  },
  watch: {
    searchQuery: debounce(function(newVal) {
      this.filterItems(newVal)
    }, 300)
  },
  methods: {
    filterItems(query) {
      const q = query.toLowerCase()
      this.filteredItems = this.items.filter(item =>
        item.name.toLowerCase().includes(q)
      )
    }
  }
}
</script>

结合Vuex实现

// store.js
const store = new Vuex.Store({
  state: {
    items: [...],
    searchQuery: ''
  },
  getters: {
    filteredItems: state => {
      return state.items.filter(item =>
        item.name.toLowerCase().includes(state.searchQuery.toLowerCase())
      )
    }
  }
})

// 组件中使用
computed: {
  ...mapGetters(['filteredItems']),
  searchQuery: {
    get() {
      return this.$store.state.searchQuery
    },
    set(value) {
      this.$store.commit('UPDATE_SEARCH_QUERY', value)
    }
  }
}

筛选组件封装

可复用筛选组件

<template>
  <div class="filter-container">
    <slot name="input" :query="query" :updateQuery="updateQuery">
      <input 
        :value="query" 
        @input="updateQuery($event.target.value)" 
        placeholder="搜索..."
      />
    </slot>
    <slot name="results" :filteredItems="filteredItems">
      <ul>
        <li v-for="item in filteredItems" :key="getKey(item)">
          {{ item }}
        </li>
      </ul>
    </slot>
  </div>
</template>

<script>
export default {
  props: {
    items: {
      type: Array,
      required: true
    },
    filterFn: {
      type: Function,
      default: (item, query) => 
        item.toString().toLowerCase().includes(query.toLowerCase())
    },
    getKey: {
      type: Function,
      default: (item, index) => index
    }
  },
  data() {
    return {
      query: ''
    }
  },
  computed: {
    filteredItems() {
      return this.items.filter(item => 
        this.filterFn(item, this.query)
      )
    }
  },
  methods: {
    updateQuery(query) {
      this.query = query
    }
  }
}
</script>

这些方法涵盖了从基础到高级的自动筛选实现,可以根据项目需求选择合适的方案。组件化封装使得筛选功能可以在不同场景下复用,而Vuex集成则适合大型应用的状态管理需求。

标签: vue
分享给朋友:

相关文章

vue实现检测数组

vue实现检测数组

Vue 中检测数组变化的方法 Vue 的响应式系统无法直接检测到数组的某些变化,因为 JavaScript 的限制。以下是一些解决方案: 使用 Vue.set 或 this.$set Vue…

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const Bas…

vue实现文章锚点定位

vue实现文章锚点定位

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

vue原型实现

vue原型实现

Vue 原型实现的关键点 Vue.js 的原型系统是其响应式机制的核心部分,通过原型链实现数据的动态绑定和依赖收集。以下是实现 Vue 原型的主要技术要点。 数据响应式原理 Vue 通过 Objec…

vue实现mvc

vue实现mvc

Vue 实现 MVC 模式 Vue 本身是一个 MVVM(Model-View-ViewModel)框架,但可以通过结构调整实现 MVC(Model-View-Controller)模式。以下是具体实…

vue实现visual

vue实现visual

Vue 实现可视化(Visual)的常见方法 在 Vue 中实现可视化通常涉及数据可视化库的集成,以下是几种主流方案: 使用 ECharts ECharts 是一个强大的 JavaScript…