Saya menemukan paket Formulir Redux . Itu pekerjaan yang sangat bagus!
Jadi, Anda bisa menggunakan Redux dengan React-Redux .
Pertama, Anda harus membuat komponen formulir (jelas):
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;
Setelah ini, Anda menghubungkan komponen yang menangani formulir:
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);
Dan tambahkan redux-form reducer di reduksi gabungan Anda:
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;
Dan modul validator terlihat seperti ini:
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;
}
Setelah formulir selesai, saat Anda ingin mengisi semua bidang dengan beberapa nilai, Anda dapat menggunakan initialize
fungsi:
componentWillMount() {
this.props.dispatch(initialize('contact', {
name: 'test'
}, ['name', 'address', 'phone']));
}
Cara lain untuk mengisi formulir adalah dengan mengatur nilai awal.
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);
Jika Anda punya cara lain untuk menangani ini, tinggalkan pesan! Terima kasih.
redux-forms
? Saya bertanya-tanya bagaimana timbanganredux-form
adalah kepalang pada semua versi IE, termasuk Edge. Jika Anda harus mendukungnya, lihat di mana saja.UPDATE: 2018 dan saya hanya akan menggunakan Formik (atau perpustakaan seperti Formik)
Ada juga bereaksi-redux-bentuk ( langkah-demi-langkah ), yang tampaknya bertukar beberapa redux-bentuk 's javascript (& boilerplate) dengan deklarasi markup. Kelihatannya bagus, tapi saya belum menggunakannya.
Potongan dan tempel dari readme:
./components/my-form-component.js
Sunting: Perbandingan
Dokumen reaksi-redux-form menyediakan perbandingan vs redux-bentuk:
https://davidkpiano.github.io/react-redux-form/docs/guides/compare-redux-form.html
sumber
Bagi mereka yang tidak peduli tentang perpustakaan besar untuk menangani masalah terkait formulir, saya akan merekomendasikan redux-form-utils .
Ini dapat menghasilkan nilai dan mengubah penangan untuk kontrol formulir Anda, menghasilkan reduksi formulir, pembuat tindakan praktis untuk menghapus bidang tertentu (atau semua), dll.
Yang perlu Anda lakukan adalah mengumpulkannya dalam kode Anda.
Dengan menggunakan
redux-form-utils
, Anda berakhir dengan manipulasi formulir seperti berikut:Namun, pustaka ini hanya menyelesaikan masalah
C
danU
, untukR
danD
, mungkinTable
komponen yang lebih terintegrasi adalah antipate.sumber
Hanya hal lain bagi mereka yang ingin membuat komponen formulir yang sepenuhnya dikontrol tanpa menggunakan perpustakaan besar.
ReduxFormHelper - kelas ES6 kecil, kurang dari 100 baris:
Itu tidak melakukan semua pekerjaan untuk Anda. Namun itu memfasilitasi pembuatan, validasi dan penanganan komponen formulir yang dikendalikan. Anda bisa saja menyalin & menempelkan kode di atas ke proyek Anda atau sebaliknya, memasukkan pustaka yang terkait -
redux-form-helper
(plug!).Cara Penggunaan
Langkah pertama adalah menambahkan data spesifik ke status Redux yang akan mewakili status formulir kami. Data ini akan menyertakan nilai bidang saat ini serta set bendera kesalahan untuk setiap bidang dalam formulir.
Status formulir dapat ditambahkan ke peredam yang ada atau didefinisikan dalam peredam yang terpisah.
Selain itu, perlu untuk menentukan tindakan spesifik yang memulai pembaruan status formulir serta pembuat tindakan masing-masing.
Contoh tindakan :
Contoh peredam :
Langkah kedua dan terakhir adalah membuat komponen kontainer untuk formulir kami dan menghubungkannya dengan bagian dan tindakan Redux masing-masing.
Kita juga perlu mendefinisikan model formulir yang menetapkan validasi bidang formulir. Sekarang kita instantiate
ReduxFormHelper
objek sebagai anggota komponen dan lulus di sana model formulir kami dan pembaruan pengiriman panggilan balik dari status formulir.Kemudian pada komponen
render()
metode kita harus mengikat masing-masing bidang inionChange
dan formonSubmit
acara denganprocessField()
danprocessForm()
metode masing-masing serta tampilan blok kesalahan untuk setiap bidang tergantung pada bendera bentuk kesalahan di negara bagian.Contoh di bawah ini menggunakan CSS dari kerangka Bootstrap Twitter.
Contoh Komponen Kontainer :
Demo
sumber