UNPKG

@piscium2010/v-form

Version:

This is not a form, instead it is only a form shell of which the single responsibility is validating and providing error messages. Capable of definding flexiable rules and validating multi fields at a time.

83 lines (74 loc) 2.91 kB
import React from 'react' import { Button, Select, Input, DatePicker } from 'antd' import VForm, { v } from 'v-form' const Field = VForm.fieldFactory(({ name, message, children }) => { return ( <div className={message ? 'has-error' : ''} style={{ marginBottom: 15 }}> {children} <div className='error-msg'>{message}</div> </div> ) }) const validation = v.create({ email: v.expect('Required').expect('Should be email', c => v.isEmail(c.email)), marriage: [ v.expect('Required'), v.when('marriage', c => c.marriage === 'single').validate('marriage_date') ], marriage_date: v.when('marriage', c => c.marriage === 'married').expect('Required when married') }) const style = { margin: 'auto', width: 380 } export default class Form extends React.Component { state = { values: {} } update = value => { const { values } = this.state validation.test(value, values /* context */) this.setState({ values: { ...values, ...value } }) } onSubmit = () => { const { values } = this.state const result = validation.testAllRules(values) if (result.pass) { window.alert('pass') } } render() { return ( <div style={style}> <p>Validation rules as:</p> <ul> <li>Email is required with correct format</li> <li>Marriage is required</li> <li>Date of marriage is required only when married</li> </ul> <VForm validation={validation}> <Field name='email'> <Input placeholder='Email' style={style} onChange={evt => this.update({ email: evt.target.value })} /> </Field> <Field name='marriage'> <Select placeholder='Marriage' style={style} onChange={value => this.update({ marriage: value })} > <Select.Option value="single">Single</Select.Option> <Select.Option value="married">Married</Select.Option> </Select> </Field> <Field name='marriage_date'> <DatePicker placeholder='Date of Marriage' style={style} onChange={(m, d) => this.update({ marriage_date: d })} /> </Field> <Button type="primary" onClick={this.onSubmit}>Submit</Button> </VForm> </div> ) } }