vue 表格组件 vxe-table 实现传统 ERP 那样表头放筛选框的筛选渲染方式

传统 ERP 系统习惯把筛选输入框直接放在表头下方或上方,而不是点击图标后弹出面板。vxe-table 通过 floatingFilterConfig 提供这种“浮动筛选”渲染方式:每一列的表头直接渲染一个筛选组件,输入即筛选,无需额外弹窗。筛选框显示在表头下方还是上方,由 position 控制。

vxe-table 如何实现表头直接放筛选框?

在表格配置中设置 floatingFilterConfig.enabled: true 启用浮动筛选,再通过 position: 'top' | 'bottom' 控制筛选框显示在表头的上方或下方。每一列通过 filterRender 指定筛选组件,组件会直接渲染在表头区域,而不是点击后弹出。

  • 生效前提:
    • floatingFilterConfig.enabled 必须为 true,否则 position 不生效,表头不会出现筛选框。
    • 需要筛选的列必须配置 filterRender,未配置的列不显示筛选框。
    • 表格需设置固定 height,否则浮动筛选行的高度计算可能异常。
      预期结果:表头区域出现一行(或上方一行)筛选组件,输入名称、选择性别、输入年龄、选择日期后,表格数据即时或点击确认后按条件过滤,行为接近传统 ERP 的表头筛选。

代码

image

<template>
  <div>
    显示位置:
    <vxe-radio-group v-model="gridOptions.floatingFilterConfig.position">
      <vxe-radio-button checked-value="top" content="顶部"></vxe-radio-button>
      <vxe-radio-button checked-value="bottom" content="底部"></vxe-radio-button>
    </vxe-radio-group>

    <vxe-grid v-bind="gridOptions"></vxe-grid>
  </div>
</template>

<script setup>
import { reactive } from 'vue'

const gridOptions = reactive({
  border: true,
  height: 400,
  floatingFilterConfig: {
    enabled: true,
    position: 'top'
  },
  columns: [
    { field: 'name', title: 'Name', filterRender: { name: 'VxeInput', props: { clearable: true } } },
    {
      field: 'sex',
      title: 'Sex',
      filterRender: {
        name: 'VxeSelect',
        props: {
          clearable: true
        },
        options: [
          { label: 'Man', value: 'Man' },
          { label: 'Woman', value: 'Woman' }
        ]
      }
    },
    { field: 'age', title: 'Age', filterRender: { name: 'VxeNumberInput', props: { clearable: true } } },
    { field: 'date', title: 'Date', filterRender: { name: 'VxeDatePicker', props: { clearable: true } } }
  ],
  data: [
    { id: 10001, name: 'Test1', role: 'Develop', sex: 'Woman', age: 28, date: '2025-10-01' },
    { id: 10002, name: 'Test2', role: 'Test', sex: 'Man', age: 22, date: '2025-10-02' },
    { id: 10003, name: 'Test3', role: 'PM', sex: 'Woman', age: 32, date: '2025-10-05' },
    { id: 10004, name: 'Test4', role: 'Designer', sex: 'Man', age: 54, date: '2025-10-14' },
    { id: 10005, name: 'Test5', role: 'Develop', sex: 'Man', age: 44, date: '2025-09-01' },
    { id: 10006, name: 'Test6', role: 'Develop', sex: 'Woman', age: 24, date: '2025-08-15' },
    { id: 10007, name: 'Test7', role: 'Test', sex: 'Man', age: 52, date: '2025-11-12' },
    { id: 10008, name: 'Test8', role: 'PM', sex: 'Woman', age: 34, date: '2025-11-27' },
    { id: 10009, name: 'Test9', role: 'PM', sex: 'Man', age: 24, date: '2025-10-18' },
    { id: 100010, name: 'Test10', role: 'Develop', sex: 'Woman', age: 24, date: '2025-10-25' }
  ]
})
</script>
  • 预期结果:
    • 选中“顶部”时,筛选框出现在表头文字上方;选中“底部”时,筛选框出现在表头文字下方。
    • 每个配置了 filterRender 的列都显示对应的输入/选择/日期组件,未配置的列不显示筛选框。
    • 切换位置时表格实时重排,不影响已输入或已选中的筛选条件。

image

关键配置参数

配置项 类型 默认值 说明
floatingFilterConfig.enabled Boolean false 是否启用浮动筛选,必须为 true
floatingFilterConfig.position String 'bottom' 筛选框位置,'top' 表头上方,'bottom' 表头下方
列 filterRender Object — 指定该列筛选组件;浮动筛选模式下直接渲染为表头筛选框
列 filterRender.name String — 组件名称,如 VxeInput、VxeSelect、VxeNumberInput、VxeDatePicker
列 filterRender.props Object — 传给筛选组件的属性,如 clearable: true
列 filterRender.options Array — 下拉类筛选组件的选项数据

浮动筛选与默认筛选面板的区别

维度 传统筛选(filterConfig) 浮动筛选(floatingFilterConfig)
交互方式 点击表头筛选图标弹出面板 筛选组件直接显示在表头区域
视觉位置 浮层,脱离表头 表头上方或下方,占据固定一行
适用风格 现代 Web 应用 传统 ERP、财务系统、管理后台
配置入口 filterConfig floatingFilterConfig
列配置 filterRender filterRender(复用同一套渲染器)

两种方式可以独立使用,也可以根据业务场景选择其一。如果项目需要“一眼看到所有筛选条件”,浮动筛选更合适;如果希望界面更紧凑,传统弹出面板更节省空间。

注意事项

  • filterRender 在浮动模式下直接渲染
    • 与弹出面板模式不同,浮动筛选的 filterRender 不是“面板内容”,而是表头里的筛选控件本身。因此组件的 props 需要按直接展示的场景配置,例如 clearable: true 让用户可以一键清空。
  • 未配置 filterRender 的列不显示筛选框
    • 这是正常行为。若希望某列不参与筛选,不配置 filterRender 即可。

https://vxetable.cn

posted @ 2026-11-06 11:16  你个老六  阅读(2)  评论(0)    收藏  举报