sinosoft-common-form 1.0.9 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +366 -0
- package/common-form.es.js +250 -256
- package/common-form.umd.js +1 -1
- package/package.json +2 -2
- package/style.css +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
参数介绍
|
|
2
|
+
|
|
3
|
+
Form 属性
|
|
4
|
+
|
|
5
|
+
| 参数 | 说明 | 类型 | 默认值 |
|
|
6
|
+
|-------------|------------------------------------------------|--------|--------|
|
|
7
|
+
| v-model | 表单数据,双向绑定(字段需与 prop 属性一样) | Object | - |
|
|
8
|
+
| form-column | 表单配置项,详情见下方 Column 属性 | Array | - |
|
|
9
|
+
| rules | 表单规则验证,校验规则请参考elementplus官方文档 | Array | - |
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
Column 配置项
|
|
14
|
+
|
|
15
|
+
| 参数 | 说明 | 类型 | 默认值 |
|
|
16
|
+
|---------|----------------------------------------------|--------|--------|
|
|
17
|
+
| type | 表单类型,elementplus的组件以及自己定义的组件 | String | - |
|
|
18
|
+
| label | el-form-item label 属性 | String | - |
|
|
19
|
+
| prop | el-form-item prop 属性 | String | - |
|
|
20
|
+
| field | el-form-item prop 属性 | String | - |
|
|
21
|
+
| options | elementplus的组件自定义的组件的props | Object | - |
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
Form 方法
|
|
26
|
+
|
|
27
|
+
| 事件名 | 说明 | 回调参数 |
|
|
28
|
+
|--------|--------------------------|----------|
|
|
29
|
+
| submit | 点击确认按钮拿到表单数据 | model |
|
|
30
|
+
|
|
31
|
+
参考用例:
|
|
32
|
+
@/components/index.vue
|
|
33
|
+
<template>
|
|
34
|
+
<s-form
|
|
35
|
+
:fieldList="fieldList"
|
|
36
|
+
:model="model"
|
|
37
|
+
:options="options"
|
|
38
|
+
@submit="handleBaseSubmit"
|
|
39
|
+
@cancel="cancelClick"
|
|
40
|
+
@last="handleLastClick"
|
|
41
|
+
>
|
|
42
|
+
<!-- 地址插槽示例 -->
|
|
43
|
+
<template v-slot:address>
|
|
44
|
+
<el-radio-group
|
|
45
|
+
v-model="model['addressRadioV']"
|
|
46
|
+
>
|
|
47
|
+
<el-radio
|
|
48
|
+
:label="'1q'"
|
|
49
|
+
size="large"
|
|
50
|
+
>
|
|
51
|
+
{{ 111}}
|
|
52
|
+
</el-radio>
|
|
53
|
+
<el-radio
|
|
54
|
+
:label="'2q'"
|
|
55
|
+
size="large"
|
|
56
|
+
>
|
|
57
|
+
{{ 222 }}
|
|
58
|
+
</el-radio>
|
|
59
|
+
</el-radio-group>
|
|
60
|
+
</template>
|
|
61
|
+
<!-- 小项插槽示例 -->
|
|
62
|
+
<template v-slot:slotItem1>
|
|
63
|
+
<div>slotItem1</div>
|
|
64
|
+
</template>
|
|
65
|
+
<template v-slot:slotItem2>
|
|
66
|
+
<div>slotItem2</div>
|
|
67
|
+
</template>
|
|
68
|
+
<template v-slot:slotItem3>
|
|
69
|
+
<div>slotItem3</div>
|
|
70
|
+
</template>
|
|
71
|
+
<template v-slot:slotItem4>
|
|
72
|
+
<div>slotItem4</div>
|
|
73
|
+
</template>
|
|
74
|
+
<template v-slot:slotItem5>
|
|
75
|
+
<div>slotItem5</div>
|
|
76
|
+
</template>
|
|
77
|
+
|
|
78
|
+
<!-- 如果不使用默认的按钮可以使用插槽自定义内容, 插槽返回的model就是当前表单的数据 -->
|
|
79
|
+
<!-- <template #buttons="{ model }">
|
|
80
|
+
<el-button">提交</el-button>
|
|
81
|
+
</template> -->
|
|
82
|
+
</s-form>
|
|
83
|
+
<!-- </el-card> -->
|
|
84
|
+
</template>
|
|
85
|
+
<script lang="ts" setup>
|
|
86
|
+
import { exampleForm } from '../config/form'
|
|
87
|
+
import { ref, reactive } from 'vue'
|
|
88
|
+
import { default as sForm } from '../package/Index.vue'
|
|
89
|
+
|
|
90
|
+
// 本项目EasyForm组件自动引入,如复制此代码,需根据路径引入Form组件后使用
|
|
91
|
+
const fieldList: Form.FieldItem[] = exampleForm.baseForExample
|
|
92
|
+
// 按钮配置
|
|
93
|
+
const options = reactive({
|
|
94
|
+
labelPosition: 'top',//表单标签位置
|
|
95
|
+
btnConfig: [ //表单按钮配置
|
|
96
|
+
{
|
|
97
|
+
isShow: true,
|
|
98
|
+
name: '提交',
|
|
99
|
+
emitName: 'submit',
|
|
100
|
+
btnCode: '11111',
|
|
101
|
+
size: '90px',
|
|
102
|
+
isRule: true,
|
|
103
|
+
style: 'margin-right: 30px'
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
isShow: true,
|
|
107
|
+
name: '上一步',
|
|
108
|
+
emitName: 'last',
|
|
109
|
+
size: '90px',
|
|
110
|
+
btnCode: '11111',
|
|
111
|
+
isRule: false,
|
|
112
|
+
style: 'margin-right: 30px'
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
isShow: true,
|
|
116
|
+
name: '重置',
|
|
117
|
+
emitName: 'reset',
|
|
118
|
+
size: '90px',
|
|
119
|
+
btnCode: '11111',
|
|
120
|
+
isRule: false,
|
|
121
|
+
style: 'margin-right: 30px'
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
isShow: true,
|
|
125
|
+
name: '下一步',
|
|
126
|
+
emitName: 'submit',
|
|
127
|
+
btnCode: '11111',
|
|
128
|
+
size: '90px',
|
|
129
|
+
isRule: true,
|
|
130
|
+
style: 'margin-right: 30px'
|
|
131
|
+
},
|
|
132
|
+
|
|
133
|
+
]
|
|
134
|
+
})
|
|
135
|
+
const model = ref<Record<string, any>>({
|
|
136
|
+
// 地址项字段
|
|
137
|
+
addressStreet: '',
|
|
138
|
+
addressHouse: '',
|
|
139
|
+
addressMansion: '',
|
|
140
|
+
block: '',
|
|
141
|
+
floor: '',
|
|
142
|
+
flat: '',
|
|
143
|
+
addressLang: '1',
|
|
144
|
+
addressNation:'',
|
|
145
|
+
addressCity:'',
|
|
146
|
+
addressArea:'',
|
|
147
|
+
addressAreaC:'',
|
|
148
|
+
// 姓名项字段
|
|
149
|
+
nameEnFamily: '',
|
|
150
|
+
nameEn: '',
|
|
151
|
+
nameChFamily: '',
|
|
152
|
+
nameCh: '',
|
|
153
|
+
// 单选字段
|
|
154
|
+
radioValue: '',
|
|
155
|
+
// 性别字段
|
|
156
|
+
gender: 1,
|
|
157
|
+
// 多选字段
|
|
158
|
+
hobbies: [1],
|
|
159
|
+
// 下拉字段
|
|
160
|
+
job: 3,
|
|
161
|
+
// 密码字段
|
|
162
|
+
password:'',
|
|
163
|
+
// 只读字段
|
|
164
|
+
readonly: '只读输入框',
|
|
165
|
+
// 日期字段
|
|
166
|
+
date: new Date(2000, 1, 1, 12, 0, 0),
|
|
167
|
+
// 留言板字段
|
|
168
|
+
summary: 'lalalallallaa',
|
|
169
|
+
// 地址插槽字段
|
|
170
|
+
addressRadioV: '2q',
|
|
171
|
+
// 手机输入字段
|
|
172
|
+
areaCode:'+998',
|
|
173
|
+
phoneNumber:'0000000'
|
|
174
|
+
})
|
|
175
|
+
/**
|
|
176
|
+
* 注意: model数据模型非必填项,如果仅仅是用于数据收集,model参数可以不用填,表单的submit事件会返回所有搜集的数据对象
|
|
177
|
+
* 如果是编辑的情况下,页面需要回显数据,则model数据模型必须要填写
|
|
178
|
+
*/
|
|
179
|
+
const handleBaseSubmit = (model: Record<string, any>) => {
|
|
180
|
+
console.log('handleBaseSubmit', model)
|
|
181
|
+
}
|
|
182
|
+
const handleLastClick = (model: Record<string, any>) => {
|
|
183
|
+
console.log('handleLastClick', model)
|
|
184
|
+
}
|
|
185
|
+
const cancelClick = (model: Record<string, any>) => {
|
|
186
|
+
console.log('cancleClick', model)
|
|
187
|
+
}
|
|
188
|
+
const handleBaseNext = (model: Record<string, any>) => {
|
|
189
|
+
console.log('handleBaseNextClick', model)
|
|
190
|
+
}
|
|
191
|
+
</script>
|
|
192
|
+
<style lang="scss" scoped></style>
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
配置文件:
|
|
197
|
+
@/config/form.ts
|
|
198
|
+
|
|
199
|
+
// 表单配置示例
|
|
200
|
+
export const exampleForm = {
|
|
201
|
+
baseForExample: [
|
|
202
|
+
{ type: 'title', title: '地址'},
|
|
203
|
+
{
|
|
204
|
+
type: 'address',
|
|
205
|
+
disabled: false ,
|
|
206
|
+
rules: {
|
|
207
|
+
addressStreet: [{ required: true, message: '111 is required' }] ,
|
|
208
|
+
addressHouse: [{ required: true, message: 'addressHouse is required' }] ,
|
|
209
|
+
addressMansion: [{ required: true, message: 'addressMansion is required' }] ,
|
|
210
|
+
block: [{ required: true, message: 'block is required' }] ,
|
|
211
|
+
floor: [{ required: true, message: 'floor is required' }] ,
|
|
212
|
+
nameCh: [{ required: true, message: 'nameCh is required' }] ,
|
|
213
|
+
flat: [{ required: true, message: 'flat is required' }] ,
|
|
214
|
+
addressLang: [{ required: true, message: 'addressLang is required' }] ,
|
|
215
|
+
addressNation: [{ required: true, message: 'addressNation is required' }] ,
|
|
216
|
+
addressCity: [{ required: true, message: 'addressCity is required' }] ,
|
|
217
|
+
addressArea: [{ required: true, message: 'addressArea is required' }] ,
|
|
218
|
+
addressAreaC: [{ required: true, message: 'addressAreaC is required' }] ,
|
|
219
|
+
},
|
|
220
|
+
field:{
|
|
221
|
+
placeholderAddressStreet: '請輸入街道名称',
|
|
222
|
+
addressStreet: 'addressStreet',
|
|
223
|
+
placeholderAddressHouse: '請輸入屋院名稱',
|
|
224
|
+
addressHouse: 'addressHouse',
|
|
225
|
+
placeholderAddressMansion: '請輸入大廈名稱',
|
|
226
|
+
addressMansion: 'addressMansion',
|
|
227
|
+
placeholderBlock: '請輸入block',
|
|
228
|
+
block: 'block',
|
|
229
|
+
placeholderFloor: '請輸入楼',
|
|
230
|
+
floor: 'floor',
|
|
231
|
+
placeholderFlat: '請輸入室',
|
|
232
|
+
flat: 'flat',
|
|
233
|
+
addressLang: 'addressLang',
|
|
234
|
+
addressNation:'addressNation',
|
|
235
|
+
addressCity:'addressCity',
|
|
236
|
+
addressArea:'addressArea',
|
|
237
|
+
addressAreaC:'addressAreaC',
|
|
238
|
+
},
|
|
239
|
+
optionsLang: {
|
|
240
|
+
data: [
|
|
241
|
+
{ name: '中文地址', code: 1 },
|
|
242
|
+
{ name: '英文地址', code: 2 }]
|
|
243
|
+
},
|
|
244
|
+
optionsSelectNation: { data: [{ name: '國家', code: 1 }, { name: '國家1', code: 2 }, { name: '國家2', code: 3 }] },
|
|
245
|
+
optionsSelectCity: { data: [{ name: '城市', code: 1 }, { name: '城市1', code: 2 }, { name: '城市2', code: 3 }] },
|
|
246
|
+
optionsSelectArea: { data: [{ name: '區域', code: 1 }, { name: '區域1', code: 2 }, { name: '區域2', code: 3 }] },
|
|
247
|
+
optionsSelectAreaC: { data: [{ name: '子地區', code: 1 }, { name: '子地區1', code: 2 }, { name: '子地區2', code: 3 }] },
|
|
248
|
+
},
|
|
249
|
+
{ type: 'title', title: '标题内容'},
|
|
250
|
+
{ label: '姓名',
|
|
251
|
+
type: 'name',
|
|
252
|
+
disabled: false ,
|
|
253
|
+
rules: {
|
|
254
|
+
nameEnFamily: [{ required: true, message: '11 is required' }] ,
|
|
255
|
+
nameEn: [{ required: true, message: '22 is required' }] ,
|
|
256
|
+
nameChFamily: [{ required: true, message: '33 is required' }] ,
|
|
257
|
+
nameCh: [{ required: true, message: '44 is required' }] ,
|
|
258
|
+
},
|
|
259
|
+
placeholderNameChFamily: '請輸入中文姓',
|
|
260
|
+
placeholderNameEnFamily: '請輸入英文姓',
|
|
261
|
+
placeholderNameEn: '請輸入英文名',
|
|
262
|
+
placeholderNameCh: '請輸入中文名',
|
|
263
|
+
field: {
|
|
264
|
+
nameEnFamily: 'nameEnFamily',
|
|
265
|
+
nameEn: 'nameEn',
|
|
266
|
+
nameChFamily: 'nameChFamily',
|
|
267
|
+
nameCh: 'nameCh'
|
|
268
|
+
},
|
|
269
|
+
},
|
|
270
|
+
{type: 'slotItem1'},
|
|
271
|
+
{type: 'slotItem2'},
|
|
272
|
+
{type: 'slotItem3'},
|
|
273
|
+
{type: 'slotItem4'},
|
|
274
|
+
{ label: '单选',
|
|
275
|
+
field: 'radioValue',
|
|
276
|
+
rules: [{ required: true, message: '单选 is required' }],
|
|
277
|
+
type: 'radio',
|
|
278
|
+
options: { data: [{ name: '男', code: 1 }, { name: '女', code: 0 }] }
|
|
279
|
+
},
|
|
280
|
+
{ label: '性别',
|
|
281
|
+
field:'gender',
|
|
282
|
+
// style: 'width: 100%',
|
|
283
|
+
rules: [{ required: true, message: '性别 is required' }],
|
|
284
|
+
type: 'gender',
|
|
285
|
+
options: { data: [{ name: '男', code: "F" }, { name: '女', code: "M" }] }
|
|
286
|
+
},
|
|
287
|
+
{ label: '多选',
|
|
288
|
+
field: 'hobbies',
|
|
289
|
+
style: 'width: 100%',
|
|
290
|
+
rules: [{ required: true, message: '多选 is required' }],
|
|
291
|
+
type: 'checkbox',
|
|
292
|
+
ways: 'row', //column or row
|
|
293
|
+
options: { data: [{ name: '吃饭', code: 1 }, { name: '睡觉', code: 2 }, { name: '写代码', code: 3 }] }
|
|
294
|
+
},
|
|
295
|
+
{type: 'slotItem5'},
|
|
296
|
+
{ label: '下拉',
|
|
297
|
+
rules: [{ required: true, message: '下拉 is required' }],
|
|
298
|
+
field: 'job',
|
|
299
|
+
type: 'select',
|
|
300
|
+
options: { data: [{ name: '吃饭', code: 1 }, { name: '睡觉', code: 2 }, { name: '写代码', code: 3 }] }
|
|
301
|
+
},
|
|
302
|
+
{ label: '密码',
|
|
303
|
+
field: 'password',
|
|
304
|
+
rules: [{ required: true, message: '密码 is required' }],
|
|
305
|
+
type: 'password',
|
|
306
|
+
placeholder: '这是一个密码输入框'
|
|
307
|
+
},
|
|
308
|
+
{ label: '只读',
|
|
309
|
+
field: 'readonly',
|
|
310
|
+
rules: [{ required: true, message: '只读 is required' }],
|
|
311
|
+
readonly: true,
|
|
312
|
+
placeholder: '这是一个只读输入框'
|
|
313
|
+
},
|
|
314
|
+
{ label: '日期',
|
|
315
|
+
field: 'date',
|
|
316
|
+
rules: [{ required: true, message: '日期 is required' }],
|
|
317
|
+
type: 'datetime',
|
|
318
|
+
placeholder: '请选择日期'
|
|
319
|
+
},
|
|
320
|
+
{ label: '留言板',
|
|
321
|
+
rules: [{ required: true, message: '留言板 is required' }],
|
|
322
|
+
field: 'summary',
|
|
323
|
+
type: 'textarea',
|
|
324
|
+
placeholder: '留言板'
|
|
325
|
+
},
|
|
326
|
+
{ label: '手机号码',
|
|
327
|
+
rules: {
|
|
328
|
+
areaCode: [{ required: true, message: 'areaCode1 is required' }] ,
|
|
329
|
+
phoneNumber: [{ required: true, message: 'phoneNumber1 is required' }] ,
|
|
330
|
+
},
|
|
331
|
+
field: {
|
|
332
|
+
areaCode:'areaCode',
|
|
333
|
+
phoneNumber:'phoneNumber'
|
|
334
|
+
},
|
|
335
|
+
disabled:false,
|
|
336
|
+
type: 'phone',
|
|
337
|
+
placeholder: '请输入手机号码' ,
|
|
338
|
+
clearable:true,
|
|
339
|
+
options: {placeholder:'', data: [{ name: '+852', code: 1 }, { name: '+654', code: 2 }, { name: '+765', code: 3 }] }
|
|
340
|
+
},
|
|
341
|
+
{ label: '手机号码2',
|
|
342
|
+
rules: {
|
|
343
|
+
areaCode: [{ required: true, message: 'areaCode2 is required' }] ,
|
|
344
|
+
phoneNumber: [{ required: true, message: 'phoneNumber2 is required' }] ,
|
|
345
|
+
},
|
|
346
|
+
field: {
|
|
347
|
+
areaCode:'areaCode2',
|
|
348
|
+
phoneNumber:'phoneNumber2'
|
|
349
|
+
},
|
|
350
|
+
disabled:false,
|
|
351
|
+
type: 'phone',
|
|
352
|
+
placeholder: '请输入手机号码' ,
|
|
353
|
+
clearable:true,
|
|
354
|
+
options: {placeholder:'', data: [{ name: '+852', code: 1 }, { name: '+654', code: 2 }, { name: '+765', code: 3 }] }
|
|
355
|
+
}
|
|
356
|
+
],
|
|
357
|
+
customkeyForm: [
|
|
358
|
+
{ label: '标题', field: 'name' },
|
|
359
|
+
{ label: '性别', field: 'gender', type: 'radio', options: { labelkey: 'title', valueKey: 'val', data: [{ title: '男', val: 1 }, { title: '女', val: 0 }] } }
|
|
360
|
+
],
|
|
361
|
+
ruleForm: [
|
|
362
|
+
{ label: '姓名', field: 'name', rules: [{ required: true, message: 'name is required' }] },
|
|
363
|
+
{ label: '邮箱', field: 'email', rules: [{ required: true, validator: checkEmail }] }
|
|
364
|
+
]
|
|
365
|
+
} as Record<string, Form.FieldItem[]>
|
|
366
|
+
|