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

如何为Bootstrap Vue Table编写自定义筛选函数?

Bootstrap Vue Table 自定义筛选函数配置与搜索功能实现

要在Bootstrap Vue Table中实现自定义搜索筛选,核心是通过filter-function属性绑定自定义筛选逻辑,同时优化你的防抖搜索实现,以下是具体步骤:

一、filter-function 基础配置说明

filter-function是<b-table>的核心自定义筛选属性,它接收一个函数,该函数会遍历每条数据项并返回布尔值:

  • 参数:item(当前数据项)、filter(搜索关键词)、fields(表格字段配置数组)
  • 返回值:true保留该数据项,false过滤掉该数据项

二、修正防抖搜索逻辑

你当前的防抖实现用$nextTick是错误的,$nextTick用于DOM更新后执行回调,并非延迟防抖。正确的防抖应该用setTimeout实现:

tableSearchDebounce(event) {
  clearTimeout(this.$_debounceTimer);
  // 延迟300ms更新关键词,避免频繁触发筛选
  this.$_debounceTimer = setTimeout(() => {
    this.filterTableInputSearch = event.target.value;
  }, 300);
}

三、实现自定义筛选函数

根据需求选择不同的筛选逻辑:

1. 模糊匹配所有字段

遍历表格所有字段,只要任意字段包含关键词就保留数据:

customFilter(item, filter, fields) {
  if (!filter) return true; // 无关键词时返回全部数据
  const lowerFilter = filter.toLowerCase();
  return fields.some(field => {
    const value = item[field.key || field];
    return value && value.toString().toLowerCase().includes(lowerFilter);
  });
}

2. 仅匹配指定字段

如果只需要在特定字段(比如name、description)中搜索:

customFilter(item, filter, fields) {
  if (!filter) return true;
  const lowerFilter = filter.toLowerCase();
  const targetFields = ['name', 'description']; // 指定搜索字段
  return targetFields.some(field => {
    const value = item[field];
    return value && value.toString().toLowerCase().includes(lowerFilter);
  });
}

四、整合完整代码

将筛选函数绑定到<b-table>,并优化模板结构:

<template>
  <div>
    <!-- 非历史页面搜索框 -->
    <input
      @input.native="tableSearchDebounce"
      :class="history ? 'mb-0' : ''"
      v-if="!history"
      placeholder="搜索..."
    />
    <!-- 历史页面搜索框 -->
    <input
      v-model="filterTableInputSearchHistory"
      :class="history ? 'mb-0' : ''"
      v-else
      placeholder="搜索历史..."
    />

    <b-table
      :items="items"
      :fields="fields"
      :filter="!history ? filterTableInputSearch : filterTableInputSearchHistory"
      :filter-function="customFilter" <!-- 绑定自定义筛选函数 -->
      @filtered="onFiltered"
    />
  </div>
</template>

<script>
export default {
  data() {
    return {
      history: false,
      filterTableInputSearch: '',
      filterTableInputSearchHistory: '',
      items: [], // 你的表格数据源
      fields: [], // 你的表格字段配置
      $_debounceTimer: null
    };
  },
  methods: {
    tableSearchDebounce(event) {
      clearTimeout(this.$_debounceTimer);
      this.$_debounceTimer = setTimeout(() => {
        this.filterTableInputSearch = event.target.value;
      }, 300);
    },
    customFilter(item, filter, fields) {
      if (!filter) return true;
      const lowerFilter = filter.toLowerCase();
      // 模糊匹配所有字段的示例逻辑
      return fields.some(field => {
        const value = item[field.key || field];
        return value && value.toString().toLowerCase().includes(lowerFilter);
      });
    },
    onFiltered(filteredItems) {
      // 筛选完成后的回调逻辑(比如更新分页计数)
      console.log('筛选后的数据:', filteredItems);
    }
  }
};
</script>

关键提示

  • filter-function会在filter值变化时自动触发,无需手动调用
  • 防抖延迟时间可根据需求调整(200-500ms为常用区间)
  • 自定义函数支持更复杂的逻辑,比如精确匹配、多条件组合筛选等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:50:36