rc-form@2.4.12

React High Order Form Component

/* eslint react/no-multi-comp:0, no-console:0 */
import React from 'react';
import ReactDOM from 'react-dom';
import { createForm, formShape } from 'rc-form';
class Form1 extends React.Component {
 static propTypes = {
 form: formShape,
 };
 state = {
 useInput: true,
 };
 onSubmit = (e) => {
 e.preventDefault();
 this.props.form.validateFields((error, values) => {
 if (!error) {
 console.log('ok', values);
 } else {
 console.log('error', error, values);
 }
 });
 };
 changeUseInput = (e) => {
 this.setState({
 useInput: e.target.checked,
 });
 }
 render() {
 const { getFieldError, getFieldDecorator } = this.props.form;
 return (
 <form onSubmit={this.onSubmit}>
 <h2>situation 1</h2>
 {this.state.useInput ? getFieldDecorator('name', {
 initialValue: '',
 rules: [{
 required: true,
 message: 'What\'s your name 1?',
 }],
 })(<input />) : null}
 <span>text content</span>
 {this.state.useInput ? null : getFieldDecorator('name', {
 initialValue: '',
 rules: [{
 required: true,
 message: 'What\'s your name 2?',
 }],
 })(<input />)}
 <div>
 <label>
 <input type="checkbox" checked={this.state.useInput} onChange={this.changeUseInput} />
 change input
 </label>
 {(getFieldError('name') || []).join(', ')}
 </div>
 <button>Submit</button>
 </form>
 );
 }
}
class Form2 extends React.Component {
 static propTypes = {
 form: formShape,
 };
 state = {
 useInput: true,
 };
 componentWillMount() {
 const { getFieldDecorator } = this.props.form;
 this.nameDecorator = getFieldDecorator('name', {
 initialValue: '',
 rules: [{
 required: true,
 message: 'What\'s your name?',
 }],
 });
 }
 onSubmit = (e) => {
 e.preventDefault();
 this.props.form.validateFields((error, values) => {
 if (!error) {
 console.log('ok', values);
 } else {
 console.log('error', error, values);
 }
 });
 };
 changeUseInput = (e) => {
 this.setState({
 useInput: e.target.checked,
 });
 }
 render() {
 const { getFieldError } = this.props.form;
 return (
 <form onSubmit={this.onSubmit}>
 <h2>situation 2</h2>
 {this.state.useInput ? this.nameDecorator(<input />) : null}
 <span>text content</span>
 {this.state.useInput ? null : this.nameDecorator(<input />)}
 <div>
 <label>
 <input type="checkbox" checked={this.state.useInput} onChange={this.changeUseInput} />
 change input
 </label>
 {(getFieldError('name') || []).join(', ')}
 </div>
 <button>Submit</button>
 </form>
 );
 }
}
class Form3 extends React.Component {
 static propTypes = {
 form: formShape,
 };
 state = {
 useInput: false,
 };
 onSubmit = (e) => {
 e.preventDefault();
 this.props.form.validateFields((error, values) => {
 if (!error) {
 console.log('ok', values);
 } else {
 console.log('error', error, values);
 }
 });
 };
 changeUseInput = (e) => {
 this.setState({
 useInput: e.target.checked,
 });
 }
 render() {
 const { getFieldError, getFieldDecorator } = this.props.form;
 return (
 <form onSubmit={this.onSubmit}>
 <h2>situation 3</h2>
 {getFieldDecorator('name', {
 initialValue: '',
 rules: [{
 required: true,
 message: 'What\'s your name 1?',
 }],
 })(<input />)}
 {this.state.useInput ? null : getFieldDecorator('name2', {
 initialValue: '',
 rules: [{
 required: true,
 message: 'What\'s your name 2?',
 }],
 })(<input />)}
 <div>
 <label>
 <input type="checkbox" checked={this.state.useInput} onChange={this.changeUseInput} />
 Hide second input
 </label>
 {(getFieldError('name') || []).join(', ')}
 </div>
 <button>Submit</button>
 </form>
 );
 }
}
const WrappedForm1 = createForm()(Form1);
const WrappedForm2 = createForm()(Form2);
const WrappedForm3 = createForm()(Form3);
ReactDOM.render(
 <div>
 <WrappedForm1 />
 <WrappedForm2 />
 <WrappedForm3 />
 </div>
 , document.getElementById('__react-content'));
Fork me on GitHub

AltStyle によって変換されたページ (->オリジナル) /