Ich habe das Redux Form- Paket gefunden. Es macht einen wirklich guten Job!
Sie können also Redux mit React-Redux verwenden .
Zuerst müssen Sie (offensichtlich) eine Formularkomponente erstellen:
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;
Danach verbinden Sie die Komponente, die das Formular verarbeitet:
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);
Und fügen Sie den Redux-Form-Reduzierer zu Ihren kombinierten Reduzierern hinzu:
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;
Und das Validator-Modul sieht folgendermaßen aus:
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;
}
Wenn Sie nach dem Ausfüllen des Formulars alle Felder mit einigen Werten füllen möchten, können Sie die folgende initialize
Funktion verwenden:
componentWillMount() {
this.props.dispatch(initialize('contact', {
name: 'test'
}, ['name', 'address', 'phone']));
}
Eine andere Möglichkeit, die Formulare auszufüllen, besteht darin, die Anfangswerte festzulegen.
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);
Wenn Sie eine andere Möglichkeit haben, dies zu tun, hinterlassen Sie einfach eine Nachricht! Danke dir.
redux-forms
? Ich frage mich, wie diese Kesselplatte im Vergleich zu Reaktionsformen skaliertredux-form
ist miserabel auf allen Versionen von IE, einschließlich Rand. Wenn Sie es unterstützen müssen, schauen Sie woanders hin.UPDATE: Es ist 2018 und ich werde immer nur Formik (oder Formik-ähnliche Bibliotheken) verwenden.
Es gibt auch eine React-Redux-Form ( Schritt für Schritt ), die einen Teil der Redux-Form auszutauschen scheint Javascript (& Boilerplate) gegen eine Markup-Deklaration . Es sieht gut aus, aber ich habe es noch nicht benutzt.
Ein Ausschneiden und Einfügen aus der Readme-Datei:
./components/my-form-component.js
Bearbeiten: Vergleich
Die React-Redux-Form-Dokumente bieten einen Vergleich mit der Redux-Form:
https://davidkpiano.github.io/react-redux-form/docs/guides/compare-redux-form.html
quelle
Für diejenigen, die sich nicht für eine riesige Bibliothek zur Behandlung formularbezogener Probleme interessieren, würde ich redux-form-utils empfehlen .
Es kann Werte generieren und Handler für Ihre Formularsteuerelemente ändern, Reduzierungen des Formulars generieren, praktische Aktionsersteller zum Löschen bestimmter (oder aller) Felder usw.
Alles was Sie tun müssen, ist sie in Ihrem Code zusammenzusetzen.
Wenn Sie verwenden
redux-form-utils
, erhalten Sie eine Formularmanipulation wie folgt:Diese Bibliothek löst jedoch nur das Problem,
C
undU
fürR
undD
möglicherweise ist eine stärker integrierteTable
Komponente das Antipieren.quelle
Nur eine andere Sache für diejenigen, die eine vollständig kontrollierte Formularkomponente erstellen möchten, ohne eine übergroße Bibliothek zu verwenden.
ReduxFormHelper - eine kleine ES6-Klasse mit weniger als 100 Zeilen:
Es erledigt nicht die ganze Arbeit für Sie. Es erleichtert jedoch die Erstellung, Validierung und Handhabung einer kontrollierten Formularkomponente. Sie können den obigen Code einfach kopieren und in Ihr Projekt einfügen oder stattdessen die entsprechende Bibliothek hinzufügen -
redux-form-helper
(Plug!).Wie benutzt man
Der erste Schritt besteht darin, dem Redux-Status bestimmte Daten hinzuzufügen, die den Status unseres Formulars darstellen. Diese Daten enthalten aktuelle Feldwerte sowie eine Reihe von Fehlerflags für jedes Feld im Formular.
Der Formularstatus kann zu einem vorhandenen Reduzierer hinzugefügt oder in einem separaten Reduzierer definiert werden.
Darüber hinaus müssen Sie eine bestimmte Aktion definieren, die die Aktualisierung des Formularstatus initiiert, sowie den jeweiligen Aktionsersteller.
Aktionsbeispiel :
Reduzierbeispiel :
Der zweite und letzte Schritt besteht darin, eine Containerkomponente für unser Formular zu erstellen und diese mit dem jeweiligen Teil des Redux-Status und der Aktionen zu verbinden.
Außerdem müssen wir ein Formularmodell definieren, das die Validierung von Formularfeldern spezifiziert. Jetzt instanziieren wir
ReduxFormHelper
Objekt als Mitglied der Komponente und übergeben dort unser Formularmodell und eine Rückruf-Dispatching-Aktualisierung des Formularstatus.Dann
render()
müssen wir in der Methode der KomponenteonChange
dieonSubmit
Ereignisse jedes Felds und des Formulars mit bindenprocessField()
bzw.processForm()
Methoden verknüpfen und Fehlerblöcke für jedes Feld anzeigen, abhängig von den Formularfehlerflags im Status.Im folgenden Beispiel wird CSS aus dem Twitter Bootstrap-Framework verwendet.
Beispiel für eine Containerkomponente :
Demo
quelle