CForm表单组件
# 组件介绍
这是一个基于el-form
封装,使用json
数据配置式的表单组件,支持表单项自动布局,内置多种type
,可传入插槽与自定义组件,支持form
表单校验与双向绑定v-model
# 引入组件
import { App } from "vue";
import CForm from "./CForm.vue";
export function setupRegisterGlobComp(app: App) {
app.component("CForm", CForm);
}
1
2
3
4
5
6
2
3
4
5
6
# 参数配置
额外参数 | 类型 | 必填 | 说明 |
---|---|---|---|
options | CFormProps | 必填 | 表单核心配置项 |
gutter | Number | 非必填 | 间距 |
colSpan | Object | 非必填 | 用于表单布局 |
value(v-model) | Object | 必填 | 表单内容双向绑定 |
loading | 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 lang="ts" setup>
import { ArticleModel } from "@/model/article";
import { FormInstance } from "element-plus";
const ruleFormRef = ref<FormInstance>();
const model = ref<Partial<ArticleModel>>({});
const options = computed(() => {
return [
{
name: "title",
type: "input",
label: "标题",
rules: [
{
required: true,
message: "请输入标题",
trigger: "blur"
}
],
props: {
maxLength: 50,
placeholder: "请输入标题"
}
},
{
name: "content",
type: "input",
label: "内容",
rules: [
{
required: true,
message: "请输入内容",
trigger: "blur"
}
],
props: {
autosize: { minRows: 4, maxRows: 8 },
type: "textarea",
placeholder: "请输入内容"
}
},
{
name: "type",
label: "类别",
rules: [
{
required: true,
message: "请选择类别",
trigger: "blur"
}
],
scopedSlot: "type"
}
];
});
</script>
<template>
<c-form ref="ruleFormRef" v-model:value="model" label-width="80px" :options="options">
<template #type>
<el-radio-group v-model="model.type" class="ml-4">
<el-radio label="history" size="large">历史</el-radio>
<el-radio label="literature" size="large">文学</el-radio>
<el-radio label="technology" size="large">科技</el-radio>
</el-radio-group>
</template>
</c-form>
</template>
<style scoped></style>
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
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
# 相关Q&A
help: select 如何使用 · Issue #17 · cloudhao1999/cloud-app-admin (github.com) (opens new window)
help:在Cfrom中添加富文本编辑器选项 · Issue #23 · cloudhao1999/cloud-app-admin (github.com) (opens new window)
# More
精力有限(懒),更多的使用方式可以查看源码自行探索,使用上有困难的可以在issue
上进行咨询我
编辑 (opens new window)
上次更新: 2022/09/08, 15:34:24