npm install --save redux-form-material-ui
AutoComplete
Checkbox
TimePicker
DatePicker
RadioButtonGroup
SelectField
Slider
TextField
Toggle
import { reduxForm , Field } from 'redux-form'
import MenuItem from 'material-ui/MenuItem'
import { RadioButton } from 'material-ui/RadioButton'
import {
Checkbox ,
RadioButtonGroup ,
SelectField ,
TextField ,
Toggle ,
DatePicker
} from 'redux-form-material-ui'
class MyForm extends Component {
render ( ) {
return (
< form >
< Field name = "username" component = { TextField } hintText = "Street" />
< Field name = "plan" component = { SelectField } hintText = "Select a plan" >
< MenuItem value = "monthly" primaryText = "Monthly" />
< MenuItem value = "yearly" primaryText = "Yearly" />
< MenuItem value = "lifetime" primaryText = "Lifetime" />
</ Field >
< Field name = "agreeToTerms" component = { Checkbox } label = "Agree to terms?" />
< Field name = "eventDate" component = { DatePicker } format = { null } hintText = "What day is the event?" />
< Field name = "receiveEmails" component = { Toggle } label = "Please spam me!" />
< Field name = "bestFramework" component = { RadioButtonGroup } >
< RadioButton value = "react" label = "React" />
< RadioButton value = "angular" label = "Angular" />
< RadioButton value = "ember" label = "Ember" />
</ Field >
</ form >
)
}
}
// Decorate with redux-form
MyForm = reduxForm ( {
form : 'myForm'
} ) ( MyForm )
export default MyForm
componentWillMount ( ) {
this . refs . firstField // the Field
. getRenderedComponent ( ) // on Field, returns ReduxFormMaterialUITextField
. getRenderedComponent ( ) // on ReduxFormMaterialUITextField, returns TextField
. focus ( ) // on TextField
}
render ( ) {
return (
< form >
...
< Field name = "username" component = { TextField } withRef ref = "firstField" />
...
</ form >
)
}
export default function ( values ) {
const errors = { } ;
const requiredFields = [
'firstName' ,
'lastName' ,
'email' ,
'favoriteColor' ,
'notes' ,
] ;
requiredFields . forEach ( field => {
if ( ! values [ field ] ) {
errors [ field ] = 'Required' ;
}
} ) ;
if (
values . email &&
! / ^ [ A - Z 0 - 9 . _ % + - ] + @ [ A - Z 0 - 9 . - ] + \. [ A - Z ] { 2 , 4 } $ / i. test ( values . email )
) {
errors . email = 'Invalid email address' ;
}
return errors ;
}
const sleep = ms => new Promise ( resolve => setTimeout ( resolve , ms ) ) ;
export default ( async function asyncValidate ( values /*, dispatch */ ) {
await sleep ( 1000 ) ; // simulate server latency
if ( [ '[email protected] ' , '[email protected] ' ] . includes ( values . email ) ) {
throw { email : 'Email already Exists' } ;
}
} ) ;
import React from 'react' ;
import { Field , reduxForm } from 'redux-form' ;
import TextField from 'material-ui/TextField' ;
import { RadioButton , RadioButtonGroup } from 'material-ui/RadioButton' ;
import Checkbox from 'material-ui/Checkbox' ;
import SelectField from 'material-ui/SelectField' ;
import MenuItem from 'material-ui/MenuItem' ;
import asyncValidate from './asyncValidate' ;
import validate from './validate' ;
const renderTextField = (
{ input, label, meta : { touched, error } , ...custom } ,
) => (
< TextField
hintText = { label }
floatingLabelText = { label }
errorText = { touched && error }
{ ...input }
{ ...custom }
/>
) ;
const renderCheckbox = ( { input, label } ) => (
< Checkbox
label = { label }
checked = { input . value ? true : false }
onCheck = { input . onChange }
/>
) ;
const renderRadioGroup = ( { input, ...rest } ) => (
< RadioButtonGroup
{ ...input }
{ ...rest }
valueSelected = { input . value }
onChange = { ( event , value ) => input . onChange ( value ) }
/>
) ;
const renderSelectField = (
{ input, label, meta : { touched, error } , children, ...custom } ,
) => (
< SelectField
floatingLabelText = { label }
errorText = { touched && error }
{ ...input }
onChange = { ( event , index , value ) => input . onChange ( value ) }
children = { children }
{ ...custom }
/>
) ;
export default reduxForm ( {
form : 'MaterialUiForm' , // a unique identifier for this form
validate,
asyncValidate,
} ) ( MaterialUiForm ) ;
const MaterialUiForm = props => {
const { handleSubmit, pristine, reset, submitting } = props ;
return (
< form onSubmit = { handleSubmit } >
< div >
< button type = "submit" disabled = { pristine || submitting } > Submit</ button >
< button type = "button" disabled = { pristine || submitting } onClick = { reset } >
Clear Values
</ button >
</ div >
</ form >
) ;
} ;
< div >
< Field
name = "firstName"
component = { renderTextField }
label = "First Name"
/>
</ div >
< div >
< Field name = "lastName" component = { renderTextField } label = "Last Name" />
</ div >
< div >
< Field name = "email" component = { renderTextField } label = "Email" />
</ div >
< div >
< Field name = "sex" component = { renderRadioGroup } >
< RadioButton value = "male" label = "male" />
< RadioButton value = "female" label = "female" />
</ Field >
</ div >
< div >
< Field
name = "favoriteColor"
component = { renderSelectField }
label = "Favorite Color"
>
< MenuItem value = "ff0000" primaryText = "Red" />
< MenuItem value = "00ff00" primaryText = "Green" />
< MenuItem value = "0000ff" primaryText = "Blue" />
</ Field >
</ div >
< div >
< Field name = "employed" component = { renderCheckbox } label = "Employed" />
</ div >
< div >
< Field
name = "notes"
component = { renderTextField }
label = "Notes"
multiLine = { true }
rows = { 2 }
/>
</ div >