Skip to content

Commit 090f9cb

Browse files
committed
feat: add form support template
1 parent 51718d7 commit 090f9cb

File tree

4 files changed

+114
-5
lines changed

4 files changed

+114
-5
lines changed

components/form/Form.jsx

+22-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export const FormProps = {
5757
// onSubmit: React.FormEventHandler<any>;
5858
prefixCls: PropTypes.string,
5959
hideRequiredMark: PropTypes.bool,
60+
formRef: PropTypes.func,
6061
}
6162

6263
export const ValidationRule = {
@@ -178,7 +179,7 @@ export default {
178179

179180
render () {
180181
const {
181-
prefixCls, hideRequiredMark, layout, onSubmit, $slots,
182+
prefixCls, hideRequiredMark, layout, onSubmit, $slots, formRef,
182183
} = this
183184

184185
const formClassName = classNames(prefixCls, {
@@ -187,6 +188,26 @@ export default {
187188
[`${prefixCls}-inline`]: layout === 'inline',
188189
[`${prefixCls}-hide-required-mark`]: hideRequiredMark,
189190
})
191+
if (formRef) {
192+
const NewForm = createDOMForm({
193+
fieldNameProp: 'id',
194+
fieldMetaProp: FIELD_META_PROP,
195+
fieldDataProp: FIELD_DATA_PROP,
196+
})({
197+
provide () {
198+
return {
199+
NewFormProps: this.$props,
200+
}
201+
},
202+
mounted () {
203+
formRef(this.form)
204+
},
205+
render () {
206+
return <form onSubmit={onSubmit} class={formClassName}>{$slots.default}</form>
207+
},
208+
})
209+
return <NewForm />
210+
}
190211

191212
return <form onSubmit={onSubmit} class={formClassName}>{$slots.default}</form>
192213
},

components/form/FormItem.jsx

+21-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ export const FormItemProps = {
2020
hasFeedback: PropTypes.bool,
2121
required: PropTypes.bool,
2222
colon: PropTypes.bool,
23+
fieldDecoratorId: PropTypes.string,
24+
fieldDecoratorOptions: PropTypes.object,
2325
}
2426

2527
export default {
@@ -33,6 +35,7 @@ export default {
3335
}),
3436
inject: {
3537
FormProps: { default: {}},
38+
NewFormProps: { default: {}},
3639
},
3740
data () {
3841
return { helpShow: false }
@@ -90,7 +93,7 @@ export default {
9093
},
9194

9295
getOnlyControl () {
93-
const child = this.getControls(this.$slots.default, false)[0]
96+
const child = this.getControls(this.slotDefault, false)[0]
9497
return child !== undefined ? child : null
9598
},
9699

@@ -303,12 +306,20 @@ export default {
303306
) : null
304307
},
305308
renderChildren () {
306-
const { $slots } = this
309+
// const { $slots, FormProps, NewFormProps, prop } = this
310+
// const child = filterEmpty($slots.default || [])
311+
// if (NewFormProps.form && prop && child.length) {
312+
// const getFieldDecorator = NewFormProps.form.getFieldDecorator
313+
// const rules = FormProps.rules[prop] || []
314+
// child[0] = getFieldDecorator(prop, {
315+
// rules,
316+
// })(child[0])
317+
// }
307318
return [
308319
this.renderLabel(),
309320
this.renderWrapper(
310321
this.renderValidateWrapper(
311-
filterEmpty($slots.default || []),
322+
this.slotDefault,
312323
this.renderHelp(),
313324
this.renderExtra(),
314325
),
@@ -333,6 +344,13 @@ export default {
333344
},
334345

335346
render () {
347+
const { $slots, NewFormProps, fieldDecoratorId, fieldDecoratorOptions = {}} = this
348+
const child = filterEmpty($slots.default || [])
349+
if (NewFormProps.form && fieldDecoratorId && child.length) {
350+
const getFieldDecorator = NewFormProps.form.getFieldDecorator
351+
child[0] = getFieldDecorator(fieldDecoratorId, fieldDecoratorOptions)(child[0])
352+
}
353+
this.slotDefault = child
336354
const children = this.renderChildren()
337355
return this.renderFormItem(children)
338356
},

components/form/demo/test.vue

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<template>
2+
<div>
3+
<a-form @submit="handleSubmit" :formRef="(form)=>{this.form = form}">
4+
<a-form-item
5+
label='Note'
6+
:labelCol="{ span: 5 }"
7+
:wrapperCol="{ span: 12 }"
8+
fieldDecoratorId="note"
9+
:fieldDecoratorOptions="{rules: [{ required: true, message: 'Please input your note!' }]}"
10+
>
11+
<a-input />
12+
</a-form-item>
13+
<a-form-item
14+
label='Gender'
15+
:labelCol="{ span: 5 }"
16+
:wrapperCol="{ span: 12 }"
17+
fieldDecoratorId="gender"
18+
:fieldDecoratorOptions="{rules: [{ required: true, message: 'Please select your gender!' }]}"
19+
>
20+
<a-select
21+
placeholder='Select a option and change input text above'
22+
@change="this.handleSelectChange"
23+
>
24+
<a-select-option value='male'>male</a-select-option>
25+
<a-select-option value='female'>female</a-select-option>
26+
</a-select>
27+
</a-form-item>
28+
<a-form-item
29+
:wrapperCol="{ span: 12, offset: 5 }"
30+
>
31+
<a-button type='primary' htmlType='submit'>
32+
Submit
33+
</a-button>
34+
</a-form-item>
35+
</a-form>
36+
</div>
37+
</template>
38+
39+
<script>
40+
export default {
41+
data () {
42+
return {
43+
formLayout: 'horizontal',
44+
rules: {
45+
test: [{
46+
type: 'email', message: 'The input is not valid E-mail!',
47+
}, {
48+
required: true, message: 'Please input your E-mail!',
49+
}],
50+
},
51+
}
52+
},
53+
methods: {
54+
handleSubmit (e) {
55+
e.preventDefault()
56+
this.form.validateFields((err, values) => {
57+
if (!err) {
58+
console.log('Received values of form: ', values)
59+
}
60+
})
61+
},
62+
handleSelectChange (value) {
63+
console.log(value)
64+
this.form.setFieldsValue({
65+
note: `Hi, ${value === 'male' ? 'man' : 'lady'}!`,
66+
})
67+
},
68+
},
69+
}
70+
</script>

site/dev.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Api from './components/api'
1010
import './components'
1111
import demoBox from './components/demoBox'
1212
import demoContainer from './components/demoContainer'
13-
import Test from '../components/list/demo/test'
13+
import Test from '../components/form/demo/test'
1414

1515
Vue.use(VueClipboard)
1616
Vue.use(VueRouter)

0 commit comments

Comments
 (0)