表格筛选
表格筛选会给每一个表头添加表单,填写表单后,会对表头所在的列进行数据筛选,支持多列。
表格筛选是基于 ProForm 超级表单 进行拓展,它比 ElTable 自带的更加强大,每一个表格列配置项 column.filterProps.formColumn 等于 ProFormItem 的 Props。
通过 filterProps.el 配置项,可以传入编辑表单的组件,通过 filterProps.elProps 可以给编辑表单的组件传入 Props,更多 filterProps 的功能可以先去了解 ProForm 超级表单 超级表单的配置。
表格工具的列配置按钮可以对筛选功能控制开关。
基础使用
在单列 column 使用 filter 配置项来开启表格筛选功能,默认的表单是 ElInput,可以通过 filterProps.el 配置项来修改表单类型。
ElInput 表单输入的值默认是字符串,如果需要转为数字,可以传递 modelModifiers 到 ElInput 组件中,具体情况 progress 列的配置。
<script setup lang="ts">
import type { TableColumn } from "@/components/pro/table";
import { ProTable } from "@/components/pro/table";
const data = [
{ username: "张三", gender: 1, genderCheckbox: 1, progress: 20, birthday: "2023-01-01" },
{ username: "李四", gender: 2, genderCheckbox: 2, progress: 40, birthday: "2023-02-01" },
{ username: "王五", gender: 1, genderCheckbox: 1, progress: 60, birthday: "2023-03-01" },
];
const columns: TableColumn[] = [
{
prop: "username",
label: "用户姓名",
el: "copy",
filter: true,
},
{
prop: "gender",
label: "性别",
el: "el-tag",
options: async () => {
return [
{ label: "男", value: 1 },
{ label: "女", value: 2 },
];
},
filter: true,
filterProps: {
el: "el-select",
},
},
{
prop: "genderCheckbox",
label: "性别 CheckBox",
options: [
{ label: "男", value: 1 },
{ label: "女", value: 2 },
],
filter: true,
filterProps: {
el: "checkbox-select",
// 开启多选
// formColumn: {
// elProps: {
// multiple: true,
// },
// },
},
},
{
prop: "progress",
label: "进度",
el: "el-progress",
tooltip: "学习进度",
filter: true,
filterProps: { formColumn: { elProps: { modelModifiers: { number: true } } } },
},
{
prop: "birthday",
label: "生日",
filter: true,
filterProps: {
el: "el-date-picker",
},
},
];
const handleFilter = (filterModel: Record<string, any>, filterValue: unknown, prop: string) => {
console.log(filterModel, filterValue, prop, "handleFilter");
};
const handleFilterClear = (prop: string) => {
console.log("当前清除的列为:" + prop);
};
const handleFilterReset = () => {
console.log("handleFilterClear");
};
</script>
<template>
<ProTable
:columns="columns"
:data="data"
@filter="handleFilter"
@filterClear="handleFilterClear"
@filterReset="handleFilterReset"
/>
</template>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
筛选规则
默认筛选的规则是 eq 精准匹配,可以通过 filterProps.rule 配置项来修改筛选规则。
规则如下:
- lt:小于
- gt:大于
- le:小于等于
- ge:大于等于
- eq:精准匹配
- ne:不等于
- like:模糊匹配
- notLike:不等于模糊匹配
- between:区间
- notBetween:区间外
- in:在
- notIn:不在
<script setup lang="ts">
import type { TableColumn } from "@/components/pro/table";
import { ProTable } from "@/components/pro/table";
const data = [
{ username: "张三", gender: 1, idCard: "805839158256013232", birthday: "2023-01-01" },
{ username: "李四", gender: 2, idCard: "824440124728046271", birthday: "2023-02-01" },
{ username: "王五", gender: 1, idCard: "026454951166840353", birthday: "2023-03-01" },
];
const columns: TableColumn[] = [
{
prop: "username",
label: "用户姓名",
el: "copy",
filter: true,
filterProps: {
rule: "eq", // 默认值
},
},
{
prop: "gender",
label: "性别",
el: "el-tag",
options: async () => {
return [
{ label: "男", value: 1 },
{ label: "女", value: 2 },
];
},
filter: true,
filterProps: {
el: "el-select",
rule: "eq",
},
},
{
prop: "idCard",
label: "身份证号",
filter: true,
filterProps: {
rule: "like",
},
},
{
prop: "birthday",
label: "生日",
filter: true,
filterProps: {
el: "el-date-picker",
formColumn: {
elProps: {
type: "daterange",
},
},
popoverProps: {
width: 400,
},
rule: "between",
},
},
];
</script>
<template>
<ProTable :columns="columns" :data="data" />
</template>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
自定义筛选规则
当内置的规则无法满足时,可以使用自定义筛选规则。
通过设置 rule 为函数来开启自定义规则,函数有 3 个参数:
- model:当前所有筛选参数
- row:当前行数据
- key:当前触发筛选的
prop
可以通过 model[key] 拿到当前输入的值,通过 row[key] 拿到要筛选的数据,函数最终需要返回 true 或 false,true 代表符合筛选条件,false 代表不符合过滤条件。
<script setup lang="ts">
import type { TableColumn } from "@/components/pro/table";
import { ProTable } from "@/components/pro/table";
const data = [
{ username: "张三", gender: 1, idCard: "805839158256013232", birthday: "2023-01-01" },
{ username: "李四", gender: 2, idCard: "824440124728046271", birthday: "2023-02-01" },
{ username: "王五", gender: 1, idCard: "026454951166840353", birthday: "2023-03-01" },
];
const columns: TableColumn[] = [
{
prop: "username",
label: "用户姓名",
el: "copy",
filter: true,
filterProps: {
rule: (model, row, key) => {
// 输入的值
const value = model[key];
// 表格的值
const rowValue = row[key];
// 模糊匹配
return rowValue?.includes(value);
},
},
},
{
prop: "gender",
label: "性别",
el: "el-tag",
options: async () => {
return [
{ label: "男", value: 1 },
{ label: "女", value: 2 },
];
},
filter: true,
filterProps: {
el: "el-select",
rule: (model, row, key) => {
// 输入的值
const value = model[key];
// 表格的值
const rowValue = row[key];
// 精确匹配
return value === rowValue;
},
},
},
];
</script>
<template>
<ProTable :columns="columns" :data="data" />
</template>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
options 字典
默认 options 是读取单列 column.options 作为下拉选项,但是我们可以定义一个新的 options 字典,来覆盖单列 column.options。
<script setup lang="ts">
import type { TableColumn } from "@/components/pro/table";
import { ProTable } from "@/components/pro/table";
const data = [
{ username: "张三", gender: 1, progress: 20, birthday: "2023-01-01" },
{ username: "李四", gender: 2, progress: 40, birthday: "2023-02-01" },
{ username: "王五", gender: 1, progress: 60, birthday: "2023-03-01" },
];
const columns: TableColumn[] = [
{
prop: "username",
label: "用户姓名",
el: "copy",
filter: true,
},
{
prop: "gender",
label: "性别",
el: "el-tag",
options: () => {
return [
{ label: "男", value: 1 },
{ label: "女", value: 2 },
];
},
filter: true,
filterProps: {
el: "el-select",
formColumn: {
options: () => {
return [
{ label: "男1", value: 1 },
{ label: "女2", value: 2 },
];
},
},
},
},
];
</script>
<template>
<ProTable :columns="columns" :data="data" />
</template>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
弹出框配置
通过 popoverProps 来配置 ElPopover 组件的 Props 属性。
<script setup lang="ts">
import type { TableColumn } from "@/components/pro/table";
import { ProTable } from "@/components/pro/table";
const data = [
{ username: "张三", gender: 1, progress: 20, birthday: "2023-01-01" },
{ username: "李四", gender: 2, progress: 40, birthday: "2023-02-01" },
{ username: "王五", gender: 1, progress: 60, birthday: "2023-03-01" },
];
const columns: TableColumn[] = [
{
prop: "username",
label: "用户姓名",
el: "copy",
filter: true,
filterProps: {
popoverProps: {
disabled: true,
},
},
},
{
prop: "gender",
label: "性别",
el: "el-tag",
options: async () => {
return [
{ label: "男", value: 1 },
{ label: "女", value: 2 },
];
},
filter: true,
filterProps: {
el: "el-select",
popoverProps: {
width: 600,
placement: "right",
},
},
},
{
prop: "progress",
label: "进度",
el: "el-progress",
tooltip: "学习进度",
filter: true,
filterProps: {
formColumn: {
elProps: { modelModifiers: { number: true } },
},
popoverProps: {
width: 400,
placement: "top",
},
},
},
{
prop: "birthday",
label: "生日",
filter: true,
filterProps: {
el: "el-date-picker",
popoverProps: {
placement: "left",
offset: 20,
},
},
},
];
</script>
<template>
<ProTable :columns="columns" :data="data" />
</template>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
后端筛选
通过 filterScope 配置为 server 模式,来阻止前端筛选,默认是 client 模式,即前端筛选。
filterScope 为 server 模式代表后端筛选,您需要实现 filter 方法,然后修改传入表格的数据来达到筛选效果(等价于搜索)。
如果是通过传入 request-api 配置项,则会调用 request-api 方法来重写获取数据,方法参数为筛选参数。
<script setup lang="ts">
import type { TableColumn } from "@/components/pro/table";
import { ProTable } from "@/components/pro/table";
const data = [
{ username: "张三", gender: 1, progress: 20, birthday: "2023-01-01" },
{ username: "李四", gender: 2, progress: 40, birthday: "2023-02-01" },
{ username: "王五", gender: 1, progress: 60, birthday: "2023-03-01" },
];
const columns: TableColumn[] = [
{
prop: "username",
label: "用户姓名",
el: "copy",
filter: true,
},
{
prop: "gender",
label: "性别",
el: "el-tag",
options: async () => {
return [
{ label: "男", value: 1 },
{ label: "女", value: 2 },
];
},
filter: true,
filterProps: {
el: "el-select",
},
},
{
prop: "progress",
label: "进度",
el: "el-progress",
tooltip: "学习进度",
filter: true,
filterProps: { formColumn: { elProps: { modelModifiers: { number: true } } } },
},
{
prop: "birthday",
label: "生日",
filter: true,
filterProps: {
el: "el-date-picker",
},
},
];
const handleFilter = (filterModel: Record<string, any>, filterValue: unknown, prop: string) => {
console.log(filterModel, filterValue, prop, "handleFilter");
};
</script>
<template>
<ProTable :columns="columns" :data="data" filter-scope="server" @filter="handleFilter" />
</template>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
自定义筛选图标
通过 filter-icon 插槽,可以自定义筛选图标。
<script setup lang="ts">
import type { TableColumn } from "@/components/pro/table";
import { More } from "@element-plus/icons-vue";
import { ProTable } from "@/components/pro/table";
const data = [
{ username: "张三", gender: 1, progress: 20, birthday: "2023-01-01" },
{ username: "李四", gender: 2, progress: 40, birthday: "2023-02-01" },
{ username: "王五", gender: 1, progress: 60, birthday: "2023-03-01" },
];
const columns: TableColumn[] = [
{
prop: "username",
label: "用户姓名",
el: "copy",
filter: true,
},
{
prop: "gender",
label: "性别",
el: "el-tag",
options: async () => {
return [
{ label: "男", value: 1 },
{ label: "女", value: 2 },
];
},
filter: true,
filterProps: {
el: "el-select",
},
},
{
prop: "progress",
label: "进度",
el: "el-progress",
tooltip: "学习进度",
filter: true,
filterProps: { formColumn: { elProps: { modelModifiers: { number: true } } } },
},
{
prop: "birthday",
label: "生日",
filter: true,
filterProps: {
el: "el-date-picker",
},
},
];
</script>
<template>
<ProTable :columns="columns" :data="data">
<template #filter-icon>
<el-icon style="margin-left: 4px; vertical-align: -2px; cursor: pointer">
<More />
</el-icon>
</template>
</ProTable>
</template>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
自定义按钮插槽
通过 filter-button 插槽,可以自定义表格筛选的操作按钮。
<script setup lang="ts">
import type { TableColumn } from "@/components/pro/table";
import { ProTable } from "@/components/pro/table";
const data = [
{ username: "张三", gender: 1, progress: 20, birthday: "2023-01-01" },
{ username: "李四", gender: 2, progress: 40, birthday: "2023-02-01" },
{ username: "王五", gender: 1, progress: 60, birthday: "2023-03-01" },
];
const columns: TableColumn[] = [
{
prop: "username",
label: "用户姓名",
el: "copy",
filter: true,
},
{
prop: "gender",
label: "性别",
el: "el-tag",
options: async () => {
return [
{ label: "男", value: 1 },
{ label: "女", value: 2 },
];
},
filter: true,
filterProps: {
el: "el-select",
},
},
{
prop: "progress",
label: "进度",
el: "el-progress",
tooltip: "学习进度",
filter: true,
filterProps: { formColumn: { elProps: { modelModifiers: { number: true } } } },
},
{
prop: "birthday",
label: "生日",
filter: true,
filterProps: {
el: "el-date-picker",
},
},
];
</script>
<template>
<ProTable :columns="columns" :data="data">
<template #filter-button="{ handleFilter, handleClear, handleReset, resetText, clearText, filterText }">
<el-button type="info" plain @click="handleReset">{{ resetText }}</el-button>
<el-button type="warning" plain @click="handleClear">{{ clearText }}</el-button>
<el-button type="primary" plain @click="handleFilter">{{ filterText }}</el-button>
</template>
</ProTable>
</template>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60