Encontré el paquete Redux Form . ¡Hace un muy buen trabajo!
Entonces, puedes usar Redux con React-Redux .
Primero debes crear un componente de formulario (obviamente):
import React from 'react';
import { reduxForm } from 'redux-form';
import validateContact from '../utils/validateContact';
class ContactForm extends React.Component {
render() {
const { fields: {name, address, phone}, handleSubmit } = this.props;
return (
<form onSubmit={handleSubmit}>
<label>Name</label>
<input type="text" {...name}/>
{name.error && name.touched && <div>{name.error}</div>}
<label>Address</label>
<input type="text" {...address} />
{address.error && address.touched && <div>{address.error}</div>}
<label>Phone</label>
<input type="text" {...phone}/>
{phone.error && phone.touched && <div>{phone.error}</div>}
<button onClick={handleSubmit}>Submit</button>
</form>
);
}
}
ContactForm = reduxForm({
form: 'contact', // the name of your form and the key to
// where your form's state will be mounted
fields: ['name', 'address', 'phone'], // a list of all your fields in your form
validate: validateContact // a synchronous validation function
})(ContactForm);
export default ContactForm;
Después de esto, conecta el componente que maneja el formulario:
import React from 'react';
import { connect } from 'react-redux';
import { initialize } from 'redux-form';
import ContactForm from './ContactForm.react';
class App extends React.Component {
handleSubmit(data) {
console.log('Submission received!', data);
this.props.dispatch(initialize('contact', {})); // clear form
}
render() {
return (
<div id="app">
<h1>App</h1>
<ContactForm onSubmit={this.handleSubmit.bind(this)}/>
</div>
);
}
}
export default connect()(App);
Y agregue el reductor de forma redux en sus reductores combinados:
import { combineReducers } from 'redux';
import { appReducer } from './app-reducers';
import { reducer as formReducer } from 'redux-form';
let reducers = combineReducers({
appReducer, form: formReducer // this is the form reducer
});
export default reducers;
Y el módulo validador se ve así:
export default function validateContact(data, props) {
const errors = {};
if(!data.name) {
errors.name = 'Required';
}
if(data.address && data.address.length > 50) {
errors.address = 'Must be fewer than 50 characters';
}
if(!data.phone) {
errors.phone = 'Required';
} else if(!/\d{3}-\d{3}-\d{4}/.test(data.phone)) {
errors.phone = 'Phone must match the form "999-999-9999"'
}
return errors;
}
Después de completar el formulario, cuando desee completar todos los campos con algunos valores, puede usar la initialize
función:
componentWillMount() {
this.props.dispatch(initialize('contact', {
name: 'test'
}, ['name', 'address', 'phone']));
}
Otra forma de llenar los formularios es establecer los valores iniciales.
ContactForm = reduxForm({
form: 'contact', // the name of your form and the key to
fields: ['name', 'address', 'phone'], // a list of all your fields in your form
validate: validateContact // a synchronous validation function
}, state => ({
initialValues: {
name: state.user.name,
address: state.user.address,
phone: state.user.phone,
},
}))(ContactForm);
Si tienes otra forma de manejar esto, ¡solo deja un mensaje! Gracias.
redux-forms
? Me pregunto cómo se escala esaredux-form
es abismal en todas las versiones de IE, incluido Edge. Si tiene que soportarlo, busque en otro lado.ACTUALIZACIÓN: es 2018 y solo usaré Formik (o bibliotecas similares a Formik)
También hay react-redux-form ( paso a paso ), que parece intercambiar algunos de javascript (& boilerplate) de redux-form con declaración de marcado. Se ve bien, pero aún no lo he usado.
Un cortar y pegar del archivo Léame:
./components/my-form-component.js
Editar: Comparación
Los documentos react-redux-form proporcionan una comparación frente a la forma redux:
https://davidkpiano.github.io/react-redux-form/docs/guides/compare-redux-form.html
fuente
Para aquellos a quienes no les importa una enorme biblioteca para manejar problemas relacionados con formularios, recomendaría redux-form-utils .
Puede generar valor y cambiar manejadores para sus controles de formulario, generar reductores del formulario, creadores de acciones útiles para borrar ciertos (o todos) campos, etc.
Todo lo que necesitas hacer es ensamblarlos en tu código.
Al usarlo
redux-form-utils
, terminas con una manipulación de formularios como la siguiente:Sin embargo, esta biblioteca solo resuelve el problema
C
yU
, paraR
yD
, quizás unTable
componente más integrado es antipatear.fuente
Solo otra cosa para aquellos que desean crear un componente de formulario totalmente controlado sin usar una biblioteca de gran tamaño.
ReduxFormHelper : una pequeña clase ES6, menos de 100 líneas:
No hace todo el trabajo por ti. Sin embargo, facilita la creación, validación y manejo de un componente de formulario controlado. Puede copiar y pegar el código anterior en su proyecto o, en su lugar, incluir la biblioteca respectiva -
redux-form-helper
(¡enchufe!).Cómo utilizar
El primer paso es agregar datos específicos al estado de Redux que representarán el estado de nuestro formulario. Estos datos incluirán valores de campo actuales, así como un conjunto de indicadores de error para cada campo en el formulario.
El estado del formulario puede agregarse a un reductor existente o definirse en un reductor separado.
Además, es necesario definir una acción específica que inicie la actualización del estado del formulario, así como el creador de la acción correspondiente.
Ejemplo de acción :
Ejemplo reductor :
El segundo y último paso es crear un componente contenedor para nuestro formulario y conectarlo con la parte respectiva del estado y las acciones de Redux.
También necesitamos definir un modelo de formulario que especifique la validación de los campos de formulario. Ahora instanciamos el
ReduxFormHelper
objeto como miembro del componente y pasamos allí nuestro modelo de formulario y una actualización de envío de devolución de llamada del estado del formulario.Luego, en el
render()
método del componente, debemos vincularonChange
losonSubmit
eventos de cada campo y del formulario con los métodosprocessField()
yprocessForm()
respectivamente, así como mostrar los bloques de error para cada campo dependiendo de los indicadores de error del formulario en el estado.El siguiente ejemplo utiliza CSS del marco de Twitter Bootstrap.
Ejemplo de componente de contenedor :
Manifestación
fuente