SearchFilter组件
# 组件介绍
这是一个基于c-form
封装,使用json
数据配置式的搜索组件,支持表单项自动布局,内置多种type
,可传入插槽与自定义组件,支持form
表单校验与双向绑定v-model
# 引入组件
import { App } from "vue";
import SearchFilter from "./SearchFilter.vue";
export function setupRegisterGlobComp(app: App) {
app.component("SearchFilter", SearchFilter);
}
1
2
3
4
5
6
2
3
4
5
6
# 参数配置
额外参数 | 类型 | 必填 | 说明 |
---|---|---|---|
options | CFormProps | 必填 | 表单核心配置项 |
searchDisabled | Boolean | 非必填 | 是否禁用搜索按钮 |
resetDisabled | Boolean | 非必填 | 是否禁用重置按钮 |
model(v-model) | Object | 必填 | 表单内容双向绑定 |
loading | Boolean | 非必填 | 用于加载 |
showExpand | Boolean | 非必填 | 用于选项过多开启折叠 |
showReset | Boolean | 非必填 | 是否启用重置按钮 |
# 类型
type CFormChildOptions = Omit<CFormOptions, "rules" | "children">;
type CFormOptions = {
label: string; // 表单项名称
name: string; // 数据的key值
// 预先定义的类型,目前有input、select、inputNumber、timePicker、datePicker、richText
type?: string;
tagName?: string; // 传入组件的名称,会以<component is/>的形式渲染
props?: any; // 组件的内置属性
rules?: any; // 用于校验,可参考Element的rules
scopedSlot?: string; // 用于渲染一个插槽,可查看下方的代码示例
itemExtra?: any; // 用于form-item其它参数的绑定
colSpan?: any; // 参照 ElCol 的 属性
hidden?: boolean; // 是否隐藏
on?: any; // 用于事件绑定
children?: CFormChildOptions[]; // 用于将嵌套组件传入
};
interface CFormProps {
options: CFormOptions[];
gutter?: number;
colSpan?: { span: number };
value: any;
loading?: boolean;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 代码示例
<script setup lang="ts">
const initialValues = {
title: "",
content: "",
type: ""
};
const articleFilterOptions = computed(() => {
return [
{
label: "标题",
name: "title",
tagName: "el-input",
props: {
placeholder: "请输入标题",
maxLength: "24"
}
},
{
label: "内容",
name: "content",
tagName: "el-input",
props: {
placeholder: "请输入内容",
maxLength: "24"
}
},
{
label: "类型",
name: "type",
tagName: "async-select",
props: {
placeholder: "请选择类型",
url: "/article/type",
size: "default",
style: {
width: "100%"
}
}
}
// https://github.com/cloudhao1999/cloud-app-admin/issues/17
// {
// label: t("page.common.design.article.search.type"),
// name: "test",
// type: "select",
// props: {
// style: {
// width: "100%"
// }
// },
// children: [
// {
// tagName: "el-option",
// props: {
// label: "test1",
// value: "test1"
// }
// },
// {
// tagName: "el-option",
// props: {
// label: "test2",
// value: "test2"
// }
// }
// ]
// }
];
});
const searchParams = ref(initialValues);
const filterOptions = computed(() => {
return articleFilterOptions.value;
});
const handleSearch = () => {};
const handleReset = () => {};
</script>
<template>
<div class="relative w-full">
<div class="p-[8px] absolute w-full">
<div class="mx-3 mt-5">
<search-filter
:model="searchParams"
:options="filterOptions"
:show-reset="true"
@reset="handleReset"
@search="handleSearch"
/>
</div>
</div>
</div>
</template>
1
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
89
90
91
92
93
94
95
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
89
90
91
92
93
94
95
# More
精力有限(懒),更多的使用方式可以查看源码自行探索,使用上有困难的可以在issue
上进行咨询我
编辑 (opens new window)
上次更新: 2022/09/09, 10:26:46