You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现Vuetify Combobox全选已过滤列表项的功能需求

实现Vuetify Combobox过滤后全选功能

核心思路

要实现点击「Select All」只选中当前过滤后的项,关键是实时获取Combobox的搜索输入值,并基于这个值过滤数据源,再将过滤结果设为选中项。Vuetify的Combobox提供了search-input属性,专门用于绑定搜索框的输入内容。

具体修改步骤

1. 绑定搜索输入值

给Combobox添加搜索输入绑定,实时获取用户输入的过滤文本:

<v-combobox v-if="editedIndex == -1"
  label='Phase'
  v-model='editedItems.selected_values'
  :items='phases'
  item-value='pp_code'
  item-text='phasedetails'
  class="pl-2 pr-2"
  multiple
  chips
  <!-- Vue3 使用此绑定方式 -->
  v-model:search-input="searchQuery"
  <!-- Vue2 使用此绑定方式 -->
  <!-- :search-input.sync="searchQuery" -->
>
  <template v-slot:prepend-item>
    <v-list-item ripple @click="toggle()">
      <v-list-item-action>
        <v-icon :color="hasSelectedAllFiltered ? 'indigo darken-4' : ''">
          {{ icon }}
        </v-icon>
      </v-list-item-action>
      <v-list-item-content>
        <v-list-item-title>
          Select All
        </v-list-item-title>
      </v-list-item-content>
    </v-list-item>
    <v-divider class="mt-2"></v-divider>
  </template>
</v-combobox>

在组件data中声明绑定变量:

data() {
  return {
    searchQuery: '',
    // 其他原有变量...
  }
}

2. 实现过滤全选逻辑

重写toggle函数,并新增过滤辅助函数,仅选中当前搜索匹配的项:

toggle() {
  this.$nextTick(() => {
    const filteredPhases = this.getFilteredPhases()
    // 判断是否已选中所有过滤项
    const hasSelectedAll = filteredPhases.every(item => 
      this.editedItems.selected_values.some(selected => selected.pp_code === item.pp_code)
    )

    if (hasSelectedAll) {
      // 已全选则清空选中项
      this.editedItems.selected_values = []
    } else {
      // 未全选则选中所有过滤项
      this.editedItems.selected_values = [...filteredPhases]
    }
  })
},
// 辅助函数:根据搜索值过滤数据源
getFilteredPhases() {
  if (!this.searchQuery.trim()) {
    return this.phases.slice()
  }
  // 基于item-text字段做不区分大小写的模糊匹配,可按需修改匹配规则
  const query = this.searchQuery.toLowerCase()
  return this.phases.filter(item => 
    item.phasedetails.toLowerCase().includes(query)
  )
}

3. 修正全选图标状态

添加计算属性,动态判断全选状态并切换图标:

computed: {
  hasSelectedAllFiltered() {
    const filtered = this.getFilteredPhases()
    return filtered.length > 0 && this.editedItems.selected_values.length === filtered.length
  },
  icon() {
    return this.hasSelectedAllFiltered ? 'mdi-checkbox-marked' : 'mdi-checkbox-blank-outline'
  }
}

关键说明

  • 匹配规则:示例基于phasedetails字段做模糊匹配,若需匹配pp_code或其他字段,直接修改getFilteredPhases中的过滤条件即可。
  • 响应式处理:使用$nextTick确保DOM更新后再处理选中状态,避免视图不同步问题。
  • 版本兼容:注意search-input的绑定方式,Vue3用v-model:search-input,Vue2用:search-input.sync。

内容的提问来源于stack exchange,提问作者Alias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 16:25:28