Skip to content

Commit d5dc9ef

Browse files
committed
feat: add vc-form demo
1 parent be98a04 commit d5dc9ef

File tree

5 files changed

+431
-3
lines changed

5 files changed

+431
-3
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
/* eslint react/no-multi-comp:0, no-console:0 */
2+
3+
import { createForm } from '../index'
4+
import { regionStyle } from './styles'
5+
import { Switch } from 'antd'
6+
7+
const TopForm = {
8+
props: {
9+
form: Object,
10+
},
11+
render () {
12+
const { getFieldProps } = this.form
13+
return (<div style={ regionStyle }>
14+
<div>has email? </div>
15+
<div>
16+
<Switch {...getFieldProps('on', {
17+
initialValue: true,
18+
valuePropName: 'checked',
19+
})}
20+
/>
21+
</div>
22+
</div>)
23+
},
24+
}
25+
26+
const BottomForm = {
27+
props: {
28+
form: Object,
29+
on: Boolean,
30+
},
31+
render () {
32+
const { form } = this
33+
const on = form.getFieldValue('on')
34+
const style = {
35+
...regionStyle,
36+
display: on ? 'block' : 'none',
37+
}
38+
return (<div style={ style }>
39+
<div>email: </div>
40+
<div>
41+
<input {...form.getFieldProps('email', {
42+
rules: [{
43+
type: 'email',
44+
}],
45+
hidden: !on,
46+
})}
47+
/>
48+
</div>
49+
</div>)
50+
},
51+
}
52+
53+
const Form = {
54+
props: {
55+
form: Object,
56+
},
57+
methods: {
58+
onSubmit (e) {
59+
e.preventDefault()
60+
console.log(this.form.getFieldsValue())
61+
},
62+
},
63+
64+
render () {
65+
const { form } = this
66+
return (<div>
67+
<TopForm form={ form }/>
68+
<BottomForm form={ form }/>
69+
<div style={ regionStyle }>
70+
<button onClick={this.onSubmit}>submit</button>
71+
</div>
72+
</div>)
73+
},
74+
}
75+
76+
const NewForm = createForm()(Form)
77+
78+
export default {
79+
render () {
80+
return (<div>
81+
<h2>parallel form</h2>
82+
<NewForm />
83+
</div>)
84+
},
85+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/* eslint no-console:0 */
2+
3+
import { DatePicker } from 'antd'
4+
import createDOMForm from '../src/createDOMForm'
5+
import { regionStyle, errorStyle } from './styles'
6+
7+
const Form = {
8+
props: {
9+
form: Object,
10+
},
11+
methods: {
12+
onSubmit (e) {
13+
console.log('submit')
14+
e.preventDefault()
15+
this.form.validateFieldsAndScroll((error, values) => {
16+
if (!error) {
17+
console.log('ok', values)
18+
} else {
19+
console.log('error', error, values)
20+
}
21+
})
22+
},
23+
24+
reset (e) {
25+
e.preventDefault()
26+
this.form.resetFields()
27+
},
28+
29+
checkStart (rule, value, callback) {
30+
const { validateFields } = this.form
31+
validateFields(['end'], {
32+
force: true,
33+
})
34+
callback()
35+
},
36+
37+
checkEnd (rule, value, callback) {
38+
const end = value
39+
const { getFieldValue } = this.form
40+
const start = getFieldValue('start')
41+
if (!end || !start) {
42+
callback('please select both start and end time')
43+
} else if (end.valueOf() < start.valueOf()) {
44+
callback('start time should be less than end time')
45+
} else {
46+
callback()
47+
}
48+
},
49+
},
50+
51+
render () {
52+
const { form } = this
53+
const { getFieldProps, getFieldError } = form
54+
return (<div style={{ margin: 20 }}>
55+
<h2>startTime and endTime validation</h2>
56+
<form onSubmit={this.onSubmit}>
57+
<div style={ regionStyle }>
58+
<div>start: </div>
59+
<div>
60+
<DatePicker {...getFieldProps('start', {
61+
rules: [this.checkStart],
62+
})}
63+
/>
64+
</div>
65+
</div>
66+
67+
<div style={ regionStyle }>
68+
<div>end: </div>
69+
<div>
70+
<DatePicker {...getFieldProps('end', {
71+
rules: [this.checkEnd],
72+
})}
73+
/>
74+
</div>
75+
</div>
76+
77+
<div style={errorStyle}>
78+
{getFieldError('end') ? getFieldError('end').join(',') : ''}
79+
</div>
80+
81+
<div style={ regionStyle }>
82+
<button onClick={this.reset}>reset</button>
83+
&nbsp;
84+
<input type='submit' value='submit'/>
85+
</div>
86+
</form>
87+
</div>)
88+
},
89+
}
90+
91+
export default createDOMForm()(Form)

components/vc-form/demo/suggest.js

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/* eslint react/no-multi-comp:0, no-console:0 */
2+
3+
import { createForm } from '../index'
4+
import { Select } from 'antd'
5+
import { regionStyle, errorStyle } from './styles'
6+
import { mergeProps } from '../../_util/props-util'
7+
const emailTpl = ['@gmail.com', '@outlook.com', '@qq.com']
8+
const { Option } = Select
9+
const CustomInput = {
10+
props: {
11+
form: Object,
12+
},
13+
data () {
14+
return {
15+
data: [],
16+
}
17+
},
18+
methods: {
19+
onChange (v) {
20+
if (v.indexOf('@') === -1) {
21+
this.data = emailTpl.map(m => v + m)
22+
} else if (this.data.length) {
23+
this.data = []
24+
}
25+
},
26+
},
27+
28+
render () {
29+
const { getFieldProps, getFieldError, isFieldValidating } = this.form
30+
const errors = getFieldError('select')
31+
return (<div style={ regionStyle }>
32+
<div>custom select sync validate</div>
33+
<div>
34+
<Select
35+
{
36+
...mergeProps(
37+
{
38+
props: {
39+
placeholder: 'please select',
40+
mode: 'combobox',
41+
filterOption: false,
42+
},
43+
style: {
44+
width: '200px',
45+
},
46+
}, getFieldProps('select', {
47+
change: this.onChange,
48+
rules: [
49+
{
50+
type: 'email',
51+
},
52+
{
53+
required: true,
54+
},
55+
],
56+
}))
57+
}
58+
>
59+
{this.data.map((d) => {
60+
return <Option key={d} value={d}>{d}</Option>
61+
})}
62+
</Select>
63+
</div>
64+
<div style={errorStyle}>
65+
{(errors) ? errors.join(',')
66+
: <b
67+
style={{
68+
visibility: 'hidden',
69+
}}
70+
>
71+
1
72+
</b>}
73+
</div>
74+
<div style={errorStyle}>
75+
{isFieldValidating('select') ? 'validating' : <b
76+
style={{
77+
visibility: 'hidden',
78+
}}
79+
>
80+
1
81+
</b>}
82+
</div>
83+
</div>)
84+
},
85+
}
86+
87+
const Form = {
88+
props: {
89+
form: Object,
90+
},
91+
methods: {
92+
onSubmit (e) {
93+
e.preventDefault()
94+
this.form.validateFields((error, values) => {
95+
if (!error) {
96+
console.log('ok', values)
97+
} else {
98+
console.log('error', error, values)
99+
}
100+
})
101+
},
102+
},
103+
104+
render () {
105+
const { form } = this
106+
return (<div style={{ margin: '20px' }}>
107+
<h2>suggest</h2>
108+
<form onSubmit={this.onSubmit}>
109+
<CustomInput form={ form }/>
110+
111+
<div style={ regionStyle }>
112+
<button>submit</button>
113+
</div>
114+
</form>
115+
</div>)
116+
},
117+
}
118+
119+
export default createForm()(Form)
120+

0 commit comments

Comments
 (0)