Связь полей с состоянием React и Redux
У меня в приложении есть поля, которые связаны с состоянием redux. При в воде в поле состояние обновляется. Все как во всех книгак по основам реакта.
Два (возможно глупых) вопроса:
- В реальных проэктах инпуты всегда связаны со стейтом?
- Правильно ли связывать их через оброботчик события onChange, чтоб каждый ввод пользователя попадал в стейт? Как в таком случае выполнять валидацию поля с задержкой?
Части кода проекта(stackoverflow просит прикладывать код, но я думаю вопрос и так ясен).
Поля ввода в компоненте формы:
<label htmlFor="reg-phone">Phone</label>
<input id="reg-phone" placeholder="+XXX XX XXX XX XX"
value={props.phone}
onChange={props.fieldChangeHandle}
/>
{props.errors && props.errors.phone && <div className="error">{props.errors.phone}</div>}
{props.positions && props.positions.length && <>
<label className="mb-20" htmlFor="positions">Select your position</label>
{props.positions.map((element, index) => <div key={index} className="radio-element">
<input id={index} type="radio" name="positions"
onChange={props.positionChangeHandle}
defaultChecked={index === props.position}/>
<label htmlFor={index}>{element}</label>
</div>)
}
</>}
Контейнер формы:
const mapStateToProps = state => ({
phone: state.regForm.phone,
position: state.regForm.position,
errors: state.regForm.errors,
positions: state.page.positions
});
const mapDispatchToProps = {
positionChange,
fieldChange,
};
class RegFormContainer extends React.Component {
positionChangeHandle = event => this.props.positionChange(event.target.id);
fieldChangeHandle = event => {
this.props.fieldChange(event.target.id.split('-')[1], event.target.value);
};
render () {
return <RegForm
position={this.props.position}
positions={this.props.positions}
phone={this.props.phone}
errors={this.props.errors}
positionChangeHandle={this.positionChangeHandle}
fieldChangeHandle = {this.fieldChangeHandle}
/>
}
}
export default connect(mapStateToProps, mapDispatchToProps)(RegFormContainer);
Редьюсер:
const initialState = {
phone: '',
position: 0,
errors: null
};
export default function regFormReducer(state = initialState, action) {
switch (action.type) {
case FIELD_CHANGE:
return {...state, [action.payload.id]: action.payload.value};
case POSITION_CHANGE:
return {...state, position: action.payload};
default:
return state;
}
}
Ответы (1 шт):
В реальных проэктах инпуты всегда связаны со стейтом?
а что здесь Вас должно смущать?) это нормально. как альтернатива, Вы можете для
валидации формы использовать ref, чтобы проверять состояние инпутов. как Вам угодно. но на моё мнение, использовать store для хранения данный форм - не очень идея. проблема в том, что при каждом изменении store перерисовывается (срабатывает каждый reducer). если он маленький - нагрузка практически незначительная. если же он огромен, то зачем? все данные формы Вы можете хранить в state компонента.
Правильно ли связывать их через обработчик события onChange, чтоб каждый ввод пользователя попадал в стейт? Как в таком случае выполнять валидацию поля с задержкой?
любой обработчик будет правильный, если Вы добьетесь своего результата