Я нашел форму Redux пакет . Это действительно хорошая работа!
Итак, вы можете использовать Redux с React-Redux .
Сначала вам нужно создать компонент формы (очевидно):
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;
После этого вы подключаете компонент, который обрабатывает форму:
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);
И добавьте редуктор redux-form в свои комбинированные редукторы:
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;
А модуль валидатора выглядит так:
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;
}
После заполнения формы, когда вы хотите заполнить все поля некоторыми значениями, вы можете использовать initialize
функцию:
componentWillMount() {
this.props.dispatch(initialize('contact', {
name: 'test'
}, ['name', 'address', 'phone']));
}
Еще один способ заполнения форм - установить initialValues.
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);
Если у вас есть другой способ справиться с этим, просто оставьте сообщение! Спасибо.
redux-forms
? Мне интересно, как этот шаблон масштабируется по сравнению с реакционными формамиredux-form
является плачевна на все версии IE, включая Edge. Если вам нужно это поддержать, поищите в другом месте.ОБНОВЛЕНИЕ: это 2018 год, и я буду использовать только Formik (или подобные Formik библиотеки)
Существует также React-redux-form ( шаг за шагом ), который, кажется, обменивает часть redux-form javascript- (и шаблон) с объявлением разметки. Выглядит неплохо, но пока не пользовался.
Вырезать и вставить из ридми:
./components/my-form-component.js
Изменить: сравнение
Документы response-redux-form предоставляют сравнение с redux-form:
https://davidkpiano.github.io/react-redux-form/docs/guides/compare-redux-form.html
источник
Тем, кого не волнует огромная библиотека для обработки проблем, связанных с формами, я бы порекомендовал redux-form-utils .
Он может генерировать обработчики значений и изменений для ваших элементов управления формой, создавать редукторы формы, удобные создатели действий для очистки определенных (или всех) полей и т. Д.
Все, что вам нужно сделать, это собрать их в своем коде.
При использовании
redux-form-utils
вы получаете следующие манипуляции с формой:Тем не менее, эта библиотека решает только проблему
C
иU
, дляR
иD
, возможно, более интегрированныйTable
компонент является antipate.источник
Еще одна вещь для тех, кто хочет создать полностью управляемый компонент формы без использования негабаритной библиотеки.
ReduxFormHelper - небольшой класс ES6, менее 100 строк:
Он не делает за вас всю работу. Однако это облегчает создание, проверку и обработку компонента управляемой формы. Вы можете просто скопировать и вставить приведенный выше код в свой проект или вместо этого включить соответствующую библиотеку -
redux-form-helper
(подключите!).Как пользоваться
Первым шагом является добавление определенных данных в состояние Redux, которые будут представлять состояние нашей формы. Эти данные будут включать текущие значения полей, а также набор флагов ошибок для каждого поля в форме.
Состояние формы может быть добавлено к существующему редуктору или определено в отдельном редукторе.
Кроме того, необходимо определить конкретное действие, инициирующее обновление состояния формы, а также создателя соответствующего действия.
Пример действия :
Пример редуктора :
Второй и последний шаг - создать компонент-контейнер для нашей формы и связать его с соответствующей частью состояния и действий Redux.
Также нам нужно определить модель формы, определяющую проверку полей формы. Теперь мы создаем экземпляр
ReduxFormHelper
объекта как члена компонента и передаем туда нашу модель формы и обратный вызов, отправляющий обновление состояния формы.Тогда в компоненте
render()
методе мы должны связать каждое полеonChange
и форму вonSubmit
событие сprocessField()
иprocessForm()
методами соответственно, а также блоки ошибок отображения для каждого поля в зависимости от флагов формы ошибок в государстве.В приведенном ниже примере используется CSS из Twitter Bootstrap framework.
Пример компонента контейнера :
демонстрация
источник