Вам нужно будет создать пользовательский компонент для размещения внутри Field
в форме избыточности, в котором вы храните внутреннее состояние, и синхронизировать его с formReducer
, когда захотите.
Вы можетеВыполните это за пару шагов:
Создайте пользовательский компонент для использования внутри Field
.Этот компонент вводится с meta
и input
prop .
Создайте свой state
для своего React-компонента, в котором вы будете отслеживатьданные, которые вы в конечном итоге отправите в formReducer.
В своем конструкторе используйте props.input.value
, чтобы установить исходное состояние.Если вы сделаете это, вы можете использовать объект 'initialValues' для ваших reduxForm
.
Используйте connect
на react-redux
, чтобы сделать возможным использование react-form
.создатели действий.В вашем случае вы будете использовать change
создатель действий .
Создайте свою функцию рендеринга с вашим полем ввода и запустите действие change
, чтобыизмените значение вашего formReducer для этого поля.
Так что все сводится к следующему:
<Field
name="daysPerWeek"
component={MyCustomComponent} // 1
/>
...
class MyCustomComponent {
constructor(props) {
super(props);
this.state = {
value: props.input.value, // 2 and 3
}
}
....
}
4:
import { connect } from 'react-redux';
import { change } from 'react-form';
const mapDispatchToProps = (dispatch, ownProps) => ({
ourCustomChange: (value) => dispatch(change(ownProps.meta.form, ownProps.input.name, value))
})
export default connect(undefined, mapDispatchToProps)(MyCustomComponent);
5:
....
componentDidUpdate(prevProps, prevState) {
if (prevState.value !== this.state.value) {
this.debounceAndEmit();
}
}
debounceAndEmit() {
// Debounce for some time. Maybe use:
// import { debounce } from 'throttle-debounce';
// for that:
debounce(2000, () => {
this.props.ourCustomChange(this.state.value)
})
}
handleChange(event) {
// Do things here like trimming the string, regex, whatever.
this.setState({ value: event.target.value })
}
render() {
return (
<input
{...this.props.input} // Includes standard redux-form bindings for input fields.
value={this.state.value}
onChange={this.handleChange.bind(this)}
/>
)
}
....
В некоторых случаях вам, возможно, придется использовать создатель действия размытия .Например, когда вы делаете что-то, когда щелкаете за пределами поля ввода.
Если вы хотите, чтобы поля формы менялись в зависимости от других полей, вы должны использовать селекторы , чтобы вставить их значения вВаш пользовательский компонент для ответа на этот вопрос.
Это отвечает на ваш вопрос?