feat: add vc-form demo
parent
be98a04520
commit
d5dc9efe39
|
@ -0,0 +1,85 @@
|
||||||
|
/* eslint react/no-multi-comp:0, no-console:0 */
|
||||||
|
|
||||||
|
import { createForm } from '../index'
|
||||||
|
import { regionStyle } from './styles'
|
||||||
|
import { Switch } from 'antd'
|
||||||
|
|
||||||
|
const TopForm = {
|
||||||
|
props: {
|
||||||
|
form: Object,
|
||||||
|
},
|
||||||
|
render () {
|
||||||
|
const { getFieldProps } = this.form
|
||||||
|
return (<div style={ regionStyle }>
|
||||||
|
<div>has email? </div>
|
||||||
|
<div>
|
||||||
|
<Switch {...getFieldProps('on', {
|
||||||
|
initialValue: true,
|
||||||
|
valuePropName: 'checked',
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const BottomForm = {
|
||||||
|
props: {
|
||||||
|
form: Object,
|
||||||
|
on: Boolean,
|
||||||
|
},
|
||||||
|
render () {
|
||||||
|
const { form } = this
|
||||||
|
const on = form.getFieldValue('on')
|
||||||
|
const style = {
|
||||||
|
...regionStyle,
|
||||||
|
display: on ? 'block' : 'none',
|
||||||
|
}
|
||||||
|
return (<div style={ style }>
|
||||||
|
<div>email: </div>
|
||||||
|
<div>
|
||||||
|
<input {...form.getFieldProps('email', {
|
||||||
|
rules: [{
|
||||||
|
type: 'email',
|
||||||
|
}],
|
||||||
|
hidden: !on,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const Form = {
|
||||||
|
props: {
|
||||||
|
form: Object,
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onSubmit (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
console.log(this.form.getFieldsValue())
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const { form } = this
|
||||||
|
return (<div>
|
||||||
|
<TopForm form={ form }/>
|
||||||
|
<BottomForm form={ form }/>
|
||||||
|
<div style={ regionStyle }>
|
||||||
|
<button onClick={this.onSubmit}>submit</button>
|
||||||
|
</div>
|
||||||
|
</div>)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const NewForm = createForm()(Form)
|
||||||
|
|
||||||
|
export default {
|
||||||
|
render () {
|
||||||
|
return (<div>
|
||||||
|
<h2>parallel form</h2>
|
||||||
|
<NewForm />
|
||||||
|
</div>)
|
||||||
|
},
|
||||||
|
}
|
|
@ -0,0 +1,91 @@
|
||||||
|
/* eslint no-console:0 */
|
||||||
|
|
||||||
|
import { DatePicker } from 'antd'
|
||||||
|
import createDOMForm from '../src/createDOMForm'
|
||||||
|
import { regionStyle, errorStyle } from './styles'
|
||||||
|
|
||||||
|
const Form = {
|
||||||
|
props: {
|
||||||
|
form: Object,
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onSubmit (e) {
|
||||||
|
console.log('submit')
|
||||||
|
e.preventDefault()
|
||||||
|
this.form.validateFieldsAndScroll((error, values) => {
|
||||||
|
if (!error) {
|
||||||
|
console.log('ok', values)
|
||||||
|
} else {
|
||||||
|
console.log('error', error, values)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
reset (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
this.form.resetFields()
|
||||||
|
},
|
||||||
|
|
||||||
|
checkStart (rule, value, callback) {
|
||||||
|
const { validateFields } = this.form
|
||||||
|
validateFields(['end'], {
|
||||||
|
force: true,
|
||||||
|
})
|
||||||
|
callback()
|
||||||
|
},
|
||||||
|
|
||||||
|
checkEnd (rule, value, callback) {
|
||||||
|
const end = value
|
||||||
|
const { getFieldValue } = this.form
|
||||||
|
const start = getFieldValue('start')
|
||||||
|
if (!end || !start) {
|
||||||
|
callback('please select both start and end time')
|
||||||
|
} else if (end.valueOf() < start.valueOf()) {
|
||||||
|
callback('start time should be less than end time')
|
||||||
|
} else {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const { form } = this
|
||||||
|
const { getFieldProps, getFieldError } = form
|
||||||
|
return (<div style={{ margin: 20 }}>
|
||||||
|
<h2>startTime and endTime validation</h2>
|
||||||
|
<form onSubmit={this.onSubmit}>
|
||||||
|
<div style={ regionStyle }>
|
||||||
|
<div>start: </div>
|
||||||
|
<div>
|
||||||
|
<DatePicker {...getFieldProps('start', {
|
||||||
|
rules: [this.checkStart],
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style={ regionStyle }>
|
||||||
|
<div>end: </div>
|
||||||
|
<div>
|
||||||
|
<DatePicker {...getFieldProps('end', {
|
||||||
|
rules: [this.checkEnd],
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style={errorStyle}>
|
||||||
|
{getFieldError('end') ? getFieldError('end').join(',') : ''}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style={ regionStyle }>
|
||||||
|
<button onClick={this.reset}>reset</button>
|
||||||
|
|
||||||
|
<input type='submit' value='submit'/>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default createDOMForm()(Form)
|
|
@ -0,0 +1,120 @@
|
||||||
|
/* eslint react/no-multi-comp:0, no-console:0 */
|
||||||
|
|
||||||
|
import { createForm } from '../index'
|
||||||
|
import { Select } from 'antd'
|
||||||
|
import { regionStyle, errorStyle } from './styles'
|
||||||
|
import { mergeProps } from '../../_util/props-util'
|
||||||
|
const emailTpl = ['@gmail.com', '@outlook.com', '@qq.com']
|
||||||
|
const { Option } = Select
|
||||||
|
const CustomInput = {
|
||||||
|
props: {
|
||||||
|
form: Object,
|
||||||
|
},
|
||||||
|
data () {
|
||||||
|
return {
|
||||||
|
data: [],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onChange (v) {
|
||||||
|
if (v.indexOf('@') === -1) {
|
||||||
|
this.data = emailTpl.map(m => v + m)
|
||||||
|
} else if (this.data.length) {
|
||||||
|
this.data = []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const { getFieldProps, getFieldError, isFieldValidating } = this.form
|
||||||
|
const errors = getFieldError('select')
|
||||||
|
return (<div style={ regionStyle }>
|
||||||
|
<div>custom select sync validate</div>
|
||||||
|
<div>
|
||||||
|
<Select
|
||||||
|
{
|
||||||
|
...mergeProps(
|
||||||
|
{
|
||||||
|
props: {
|
||||||
|
placeholder: 'please select',
|
||||||
|
mode: 'combobox',
|
||||||
|
filterOption: false,
|
||||||
|
},
|
||||||
|
style: {
|
||||||
|
width: '200px',
|
||||||
|
},
|
||||||
|
}, getFieldProps('select', {
|
||||||
|
change: this.onChange,
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
type: 'email',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
>
|
||||||
|
{this.data.map((d) => {
|
||||||
|
return <Option key={d} value={d}>{d}</Option>
|
||||||
|
})}
|
||||||
|
</Select>
|
||||||
|
</div>
|
||||||
|
<div style={errorStyle}>
|
||||||
|
{(errors) ? errors.join(',')
|
||||||
|
: <b
|
||||||
|
style={{
|
||||||
|
visibility: 'hidden',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
1
|
||||||
|
</b>}
|
||||||
|
</div>
|
||||||
|
<div style={errorStyle}>
|
||||||
|
{isFieldValidating('select') ? 'validating' : <b
|
||||||
|
style={{
|
||||||
|
visibility: 'hidden',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
1
|
||||||
|
</b>}
|
||||||
|
</div>
|
||||||
|
</div>)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const Form = {
|
||||||
|
props: {
|
||||||
|
form: Object,
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
onSubmit (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
this.form.validateFields((error, values) => {
|
||||||
|
if (!error) {
|
||||||
|
console.log('ok', values)
|
||||||
|
} else {
|
||||||
|
console.log('error', error, values)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const { form } = this
|
||||||
|
return (<div style={{ margin: '20px' }}>
|
||||||
|
<h2>suggest</h2>
|
||||||
|
<form onSubmit={this.onSubmit}>
|
||||||
|
<CustomInput form={ form }/>
|
||||||
|
|
||||||
|
<div style={ regionStyle }>
|
||||||
|
<button>submit</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default createForm()(Form)
|
||||||
|
|
|
@ -0,0 +1,132 @@
|
||||||
|
/* eslint react/no-multi-comp:0, no-console:0 */
|
||||||
|
|
||||||
|
import { createForm } from '../index'
|
||||||
|
import { regionStyle, errorStyle } from './styles'
|
||||||
|
|
||||||
|
const Email = {
|
||||||
|
props: {
|
||||||
|
form: Object,
|
||||||
|
},
|
||||||
|
render () {
|
||||||
|
const { getFieldProps, getFieldError, isFieldValidating } = this.form
|
||||||
|
const errors = getFieldError('email')
|
||||||
|
return (<div style={ regionStyle }>
|
||||||
|
<div>email sync validate</div>
|
||||||
|
<div>
|
||||||
|
<input {...getFieldProps('email', {
|
||||||
|
initialValue: '',
|
||||||
|
validateFirst: true,
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'email',
|
||||||
|
message: '错误的 email 格式',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div style={errorStyle}>
|
||||||
|
{errors ? errors.join(',') : null}
|
||||||
|
</div>
|
||||||
|
<div style={errorStyle}>
|
||||||
|
{isFieldValidating('email') ? 'validating' : null}
|
||||||
|
</div>
|
||||||
|
</div>)
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const User = {
|
||||||
|
props: {
|
||||||
|
form: Object,
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
userExists (rule, value, callback) {
|
||||||
|
setTimeout(() => {
|
||||||
|
if (value === '1') {
|
||||||
|
callback([new Error('are you kidding?')])
|
||||||
|
} else if (value === 'yiminghe') {
|
||||||
|
callback([new Error('forbid yiminghe')])
|
||||||
|
} else {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
|
}, 300)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const { getFieldProps, getFieldError, isFieldValidating } = this.form
|
||||||
|
const errors = getFieldError('user')
|
||||||
|
return (<div style={ regionStyle }>
|
||||||
|
<div>user async validate</div>
|
||||||
|
<div>
|
||||||
|
<input {...getFieldProps('user', {
|
||||||
|
initialValue: '',
|
||||||
|
rules: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
min: 2,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
validator: this.userExists,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div style={errorStyle}>
|
||||||
|
{(errors) ? errors.join(',') : null}
|
||||||
|
</div>
|
||||||
|
<div style={errorStyle}>
|
||||||
|
{isFieldValidating('user') ? 'validating' : null}
|
||||||
|
</div>
|
||||||
|
</div>)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const Form = {
|
||||||
|
methods: {
|
||||||
|
onSubmit (e) {
|
||||||
|
console.log('submit')
|
||||||
|
e.preventDefault()
|
||||||
|
this.form.validateFields({
|
||||||
|
// firstFields: false,
|
||||||
|
}, (error, values) => {
|
||||||
|
if (!error) {
|
||||||
|
console.log('ok', values)
|
||||||
|
} else {
|
||||||
|
console.log('error', error, values)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
reset (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
this.form.resetFields()
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
render () {
|
||||||
|
const { form } = this
|
||||||
|
return (<div style={{ margin: '20px' }}>
|
||||||
|
<h2>validateFirst</h2>
|
||||||
|
<form onSubmit={this.onSubmit}>
|
||||||
|
<User form={ form }/>
|
||||||
|
|
||||||
|
<Email form={ form }/>
|
||||||
|
|
||||||
|
<div style={ regionStyle }>
|
||||||
|
<button onClick={this.reset}>reset</button>
|
||||||
|
|
||||||
|
<input type='submit' value='submit'/>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default createForm()(Form)
|
||||||
|
|
|
@ -96,7 +96,7 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
const valuesAllSet = {}
|
const valuesAllSet = {}
|
||||||
valuesAll[name] = value
|
valuesAll[name] = value
|
||||||
Object.keys(valuesAll).forEach(key => set(valuesAllSet, key, valuesAll[key]))
|
Object.keys(valuesAll).forEach(key => set(valuesAllSet, key, valuesAll[key]))
|
||||||
onValuesChange(this.$props, set({}, name, value), valuesAllSet)
|
onValuesChange(this, set({}, name, value), valuesAllSet)
|
||||||
}
|
}
|
||||||
const field = this.fieldsStore.getField(name)
|
const field = this.fieldsStore.getField(name)
|
||||||
return ({ name, field: { ...field, value, touched: true }, fieldMeta })
|
return ({ name, field: { ...field, value, touched: true }, fieldMeta })
|
||||||
|
@ -300,7 +300,7 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
if (onFieldsChange) {
|
if (onFieldsChange) {
|
||||||
const changedFields = Object.keys(fields)
|
const changedFields = Object.keys(fields)
|
||||||
.reduce((acc, name) => set(acc, name, this.fieldsStore.getField(name)), {})
|
.reduce((acc, name) => set(acc, name, this.fieldsStore.getField(name)), {})
|
||||||
onFieldsChange(this.$props, changedFields, this.fieldsStore.getNestedAllFields())
|
onFieldsChange(this, changedFields, this.fieldsStore.getNestedAllFields())
|
||||||
}
|
}
|
||||||
this.$forceUpdate()
|
this.$forceUpdate()
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
|
@ -344,7 +344,7 @@ function createBaseForm (option = {}, mixins = []) {
|
||||||
this.setFields(newFields, callback)
|
this.setFields(newFields, callback)
|
||||||
if (onValuesChange) {
|
if (onValuesChange) {
|
||||||
const allValues = this.fieldsStore.getAllValues()
|
const allValues = this.fieldsStore.getAllValues()
|
||||||
onValuesChange(this.$props, changedValues, allValues)
|
onValuesChange(this, changedValues, allValues)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue