redux-formo
v3.0.0-preview.21
Published
An alternate forms framework for Redux+React.
Maintainers
Readme
redux-formo
An alternate forms framework for Redux+React.
Why not redux-form?
- validate on blur, not change
- validate individual fields, not the whole form
Installation
npm install --save redux-formoUsage
createStore.js
import {createStore, applyMiddleware, combineReducers} from 'redux';
import thunk from 'redux-thunk';
import {reducer} from 'redux-formo';
const createStoreWithMiddleware = applyMiddleware(thunk)(createStore);
export createStoreWithMiddleware(combineReducers({
form: reducer
}));App.jsx
import React from 'react';
import form from 'redux-formo';
import filter from './filter';
import validate from './validate';
import submit from './submit';
class App extends React.Component {
render() {
const {
valid,
submitting,
submitted,
error,
fields: {name, phone},
onSubmit
} = this.props;
return (
<form onSubmit={onSubmit(submit)}>
{error && <p>{error}</p>}
<div>
<label>
Name: <input {...name}/>
</label>
{name.error && <p>{name.error}</p>}
</div>
<br/>
<div>
<label>
Phone: <input {...phone}/>
</label>
{phone.error && <p>{phone.error}</p>}
</div>
<br/>
<input
type="submit"
value={submitted ? 'Saved.' : (submitting ? 'Saving...' : 'Save')}
disabled={submitting || submitted}
/>
</form>
);
}
}
export default form({
name: 'personal-details',
fields: ['name', 'phone'],
filter, validate
})(App);Methods
form(config : Object, [mapStateToProps], [mapDispatchToProps], [mergeProps], [options])(Component)
Decorate a React Component, connecting the Redux form state and providing helper methods
for handling form and field events e.g. onSubmit(), onChange(), onBlur().
config : Object
.name : String
The name of the form.
Required.
.fields : Array
The names of the fields.
Required.
.defaults : Array
The default values of the fields.
Optional.
.filter({field, value, values}) : String | Promise
A function used to filter a field value.
Optional.
Parameters:
field- The name of the field being filteredvalue- The value of the field being filteredvalues- All the valid field values
Returns:
The filtered value.
.validate({field, value, values}) : Boolean | String | Promise
A function used to validate a field value.
Optional.
Parameters:
field- The name of the field being filteredvalue- The value of the field being filteredvalues- All the valid field values
Returns:
True if the value is valid. An error string if the value is not valid.
.submit({dispatch, values}) : void | FSA | Promise
A function used to submit the field values.
Optional.
Parameters:
dispatch- The dispatch methodvalues- All the valid field values
Returns:
Void, a Flux Standard Action or a Promise.
- if an error is thrown, the
errorproperty will be set and the form will not be marked assubmitted - if a FSA error is returned, the
errorproperty will be set and the form will not be marked assubmitted - if a promise is returned:
- if the promise is rejected, the
errorproperty will be set and the form will not be marked assubmitted - if the promise resolves a FSA error, the
errorproperty will be set and the form will not be marked assubmitted
- if the promise is rejected, the
- in all other cases, the form will be marked as
submitted
.filterOnChange : Boolean
Whether a field should be filtered when the field value changes.
Optional. Defaults to false.
.validateOnChange : Boolean
Whether a field should be validated when the field value changes.
Optional. Defaults to false.
.filterOnBlur : Boolean
Whether a field should be filtered when the field loses focus.
Optional. Defaults to true.
.validateOnBlur : Boolean
Whether a field should be validated when the field loses focus.
Optional. Defaults to true.
.filterOnSubmit : Boolean
Whether a field should be filtered when the form is submitted.
Optional. Defaults to true.
.validateOnSubmit : Boolean
Whether a field should be validated when the form is submitted.
Optional. Defaults to true.
.stateKey : String
The name of the property where the form reducer is mounted on the state.
Optional. Defaults to form.
.propKey : String
The name of the property where the form state is passed in props to the react component.
Optional. Defaults to none.
.destroyOnUnmount : Boolean
Whether the form state is destroyed when the component is unmounted.
Optional. Defaults to true.
mapStateToProps(state, ownProps) : Object
See the react-redux documentation on the connect function.
Optional.
mapDispatchToProps(dispatch, ownProps) : Object
See the react-redux documentation on the connect function.
Optional.
mergeProps(stateProps, dispatchProps, ownProps) : Object
See the react-redux documentation on the connect function.
Optional.
options : Object
See the react-redux documentation on the connect function.
Optional.
reducer.plugin(reducers : Object) : Function
Returns a new reducer that will return a new state as a result of chaining the result of the original reducer and then the result of the dictionary of reducers.
Props
The decorated component will receive the following props:
- filtering :
bool- whether one or more values are currently being filtered - validating :
bool- whether one or more values are currently being validated - submitting :
bool- whether the form is currently being submitted - submitted :
bool- whether the form has been submitted one or more times - error :
string|undefined- the error message from the last failed submission - valid :
bool- whether all the field values are valid - fields :
object- <name> -
object- name -
string- the name of the field - active -
bool- whether the field is currently active (i.e. focussed) - filtering -
bool- whether the filter function is currently running on the field - filtered -
bool- whether the field has been filtered one or more times since the store was created - validating -
bool- whether the validation function is currently running on the field - validated -
bool- whether the field has been validated one or more times since the store was created - error -
string|undefined- the error message from the previous validation - valid -
bool- whether the current value is valid - lastValidValue
*|undefined- the the last successfully validated value - value -
*|undefined- the current value - checked -
bool|undefined- true when the value is true, false when the value is false - defaultValue -
*|undefined- the defaultValue - defaultChecked -
bool|undefined- true when the value is true, false when the value is false
- name -
- <name> -
CHANGE LOG
v3.0.0
- breaking change:
filterandvalidateactions no longer take the value(s) as parameters, but get the value(s) from the state instead - breaking change:
afterValidate()no longer receives the last validvalues
v2.0.1
- fix:
mapDispatchToPropsalways returnsdispatchso thatredux-formocontinues to work whenmapDispatchToPropsis used
v2.0.0
- breaking change: Destroying the form state when the component is unmounted - set
.destroyOnUmounttofalseto restore the previous behaviour - breaking change: In order to enable the
submit()function to access the component props, thesubmit()function is now passed as a parameter to theonSubmit()handler - breaking change: Improved how initial values are set and enabled the initial values to be set from the redux state
- breaking change: Stopped coercing values to empty strings
- breaking change: Renamed
config.formtoconfig.name - breaking change: Renamed
config.formPropKeytoconfig.propKey - breaking change: Renamed
config.formStateKeytoconfig.stateKey - breaking change: Renamed
props.fields[fieldName].validValuetoprops.fields[fieldName].lastValidValue - refactored internals
v1.3.0
- added an API for hooking into the reducer
v1.2.0
- added handling of
checkboxinputs and custom inputs in the onChange event
v1.1.0
- added
.filterOnChangeand.validateOnChangeproperties to allow configuration of whether validation occurs each time the user changes the value of a field - An un-documented function,
afterValidate(), is called after validation of each is complete - may change in the future! - refactored
decorate.jsxto make it more testable
v1.0.0
- breaking change: The name of the package has changed from
the-other-redux-formtoredux-formo - breaking change: The form state is now merged into the root of your component's props unless configured by
formPropKey - breaking change: The
filter,validateandsubmitmethods now receive an object instead of numerous parameters - possible breaking change: The
filter,validateandsubmitmethods receive an object containing most recent valid values instead of the current values - possible breaking change: For compatibility with packages that adhere to
Flux Standard Action (e.g.
redux-promise), if thesubmitmethod returns/resolves a FSA error the form submission will be assumed to have failed - The
filterandvalidatemethods can return a promise, like thesubmitmethod, in order to perform asynchronous filtration and validation - Added unit tests for most methods
Design decisions
- like redux-form but unlike react-redux-form, use a different subset of the state to store values (let the user choose when they want to sync/update their model with the data on the form)
THANKS
Much of this package is inspired by the work of @erikras on redux-form. Much thanks!
