# DialogForm - 弹框表单
DialogForm 是 ProForm 的一个变体,本质上仍然是个表单。DialogForm 的表现与 ProForm 相同,可以从 ProForm 直接修改而来。
# 基础用法
<template>
<div>
<DialogForm
title="Dialog Form"
:formProps="{
'label-position': 'top'
}"
v-model="visible"
:formItems="formItems"
@onFinish="onFinish"
>
<template #name2="{ form }">
<el-input v-model="form.name2" placeholder="slot" />
</template>
</DialogForm>
<el-button @click="visible = true">Open Dialog</el-button>
</div>
</template>
<script>
export default {
name: 'BasicDialogForm',
computed: {
formItems() {
return [
{
renderLabel: () => <span>自定义活动名称<i class="el-icon-warning" /></span>,
prop: 'name1',
valueType: 'input',
fieldProps: {
placeholder: 'valueType'
}
},
{
label: '活动名称2',
prop: 'name2',
valueType: 'slot',
},
{
label: '活动名称3',
prop: 'name3',
renderField: ({ form }) => (
<el-input value={form.name3} onInput={val => form.name3 = val} placeholder="renderField" />
)
},
{
label: '活动区域1',
prop: 'region1',
valueType: 'select',
fieldProps: {
placeholder: 'options',
},
options: [
{
label: '区域一',
value: 'region1'
},
{
label: '区域二',
value: 'region2'
}
]
},
{
label: '活动区域2',
prop: 'region2',
valueType: 'select',
fieldProps: {
placeholder: 'valueEnum: Object'
},
valueEnum: {
'region1': '区域一',
'region2': '区域二'
},
},
{
label: '活动区域3',
prop: 'region3',
valueType: 'select',
fieldProps: {
placeholder: 'valueEnum: Map'
},
valueEnum: new Map([
['region1', '区域一'],
['region2', '区域二']
])
},
{
label: '活动区域4',
prop: 'region4',
valueType: 'select',
fieldProps: {
placeholder: 'optionLoader'
},
optionLoader: () => new Promise(resolve => {
setTimeout(() => {
resolve([
{
label: '区域一',
value: 'region1'
},
{
label: '区域二',
value: 'region2'
}
])
}, 100)
})
},
{
label: '活动类型1',
prop: 'type',
valueType: 'cascader',
fieldProps: {
placeholder: 'fieldProps.options',
options: this.cascaderOptions,
},
},
{
label: '活动类型2',
prop: 'type2',
valueType: 'cascader',
fieldProps: {
placeholder: 'optionLoader'
},
optionLoader: () => new Promise(resolve => {
setTimeout(() => {
resolve(this.cascaderOptions)
}, 500)
})
},
{
label: '活动时间',
prop: 'date',
valueType: 'date-picker',
fieldProps: {
'value-format': 'yyyy-MM-dd'
}
},
{
label: '活动性质',
prop: 'category',
valueType: 'checkbox-group',
options: [
{ label: '美食/餐厅线上活动', value: '美食/餐厅线上活动' },
{ label: '地推活动', value: '地推活动' },
{ label: '线下主题活动', value: '线下主题活动' },
{ label: '单纯品牌曝光', value: '单纯品牌曝光' },
],
initialValue: []
},
{
label: '特殊资源',
prop: 'resource',
valueType: 'radio-group',
options: [
{ label: '线上品牌商赞助', value: '线上品牌商赞助' },
{ label: '线下场地免费', value: '线下场地免费' }
]
},
]
}
},
data() {
return {
visible: false,
cascaderOptions: [
{
label: '球类',
value: 'ball',
children: [
{ label: '乒乓', value: '1' },
{ label: '篮球', value: '2' },
{ label: '足球', value: '3' },
]
},
{
label: '铁人三项',
value: 'other',
children: [
{ label: '游泳', value: '11' },
{ label: '跑步', value: '22' },
{ label: '骑行', value: '33' },
]
},
],
}
},
methods: {
onFinish(formData) {
console.log('form', formData)
}
}
};
</script>
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# API
DialogForm 在 el-dialog 和 el-form 上进行了一层封装,支持了一些预设。
# DialogForm Attributes
在 ProForm Attributes 基础上,新增了以下 API。
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| v-model | 是否打开弹框 | boolean | - |
| title | 弹框的标题 | string | - |
| renderTitle | 自定义弹框标题 | (form) => jsx | - |
| width | 弹框的宽度 | string | - |
| dialogProps | el-dialog attributes 的配置。注意:不支持 visible,请使用 v-model | DialogProps | - |
| dialogEvents | el-dialog events 的配置 | DialogEvents | - |
# DialogForm Events
# DialogForm Methods
在 ProForm Methods 基础上新增了以下方法
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| close | 关闭弹框 | () => void | - |
# formItemsConfig
# submitterProps
submitter 设置 false 会隐藏默认的提交按钮。
| 参数 | 说明 | 类型 | 默认值 |
|---|---|---|---|
| cancelText | 取消按钮的文本 | string | 取消 |
| confirmText | 确定按钮的文本 | string | 确定 |
| cancelButtonProps | el-button 的 attributes & button 的原生属性 | ButtonProps | - |
| confirmButtonProps | el-button 的 attributes & button 的原生属性 | ButtonProps | - |
| customRender | 自定义渲染 | false | (form , actions, doms) => jsx[] | - |
不支持通过 footer 来自定义页脚,如果要定义页脚需要使用 submitter.customRender。
customRender 的第一个参数是表单数据;第二个参数是事件对象;第三个参数是默认的 doms 数组,第一个是取消按钮,第二个是确定按钮。