В функции редукции handleSubmit
, которая делает вызов Ajax, необходимы некоторые свойства из состояния Redux в Ajax (например, идентификатор пользователя).
Это было бы достаточно легко, если бы я хотел определить handleSubmit
в компоненте формы: просто позвоните mapStateToProps
, чтобы передать все, что мне нужно, и прочитайте его из this.props
в моей handleSubmit
.
Однако, как хороший разработчик React-Redux, я пишу отдельные компоненты представления и контейнеры, поэтому мои компоненты просмотра могут быть простыми с небольшим или вообще отсутствующим поведением. Поэтому я хочу определить handleSubmit в контейнере.
Опять же, для этого создана простая-редукционная форма. Определите onSubmit
в mapDispatchToProps
, и форма будет вызывать его автоматически.
За исключением, о, подождите, в mapDispatchToProps
нет доступа к состоянию редукции.
Хорошо, не проблема, я просто передаю реквизит, который мне нужен, в handleSubmit
вместе со значениями формы.
Хмм, подождите, невозможно передать любые данные в handleSubmit
с помощью этого механизма! Вы получаете один параметр values
, и нет возможности добавить еще один параметр.
Это оставляет следующие непривлекательные альтернативы (из которых я могу проверить, что работают 1 и 2):
1 Определите обработчик отправки в компоненте формы и оттуда вызовите мою собственную функцию отправки отправителя, переданную из mapDispatchToProps. Это нормально, но мой компонент должен знать некоторые реквизиты из состояния редукции, которые не обязаны отображать форму. (Эта проблема не уникальна для редукционной формы.)
dumbSubmit(values)
{
const { mySubmitHandler, user} = this.props;
mySubmitHandler(values, user);
}
<form onSubmit={ handleSubmit(this.dumbSubmit.bind(this)) }>
Или, более кратко, все это можно объединить в функцию стрелки:
<form onSubmit={ handleSubmit((values)=>{mySubmitHandler(values, this.props.user);}
Затем, чтобы сделать этот обработчик полностью агностиком, он может просто передать все this.props обратно в пользовательский обработчик:
<form onSubmit={ handleSubmit((values)=>{mySubmitHandler(values, this.props);}
2 Определить onSubmit в mergeProps вместо mapDispatchToProps, чтобы он имел доступ к stateProps. Дэн Абрамов рекомендует не использовать mergeProps (по соображениям производительности), поэтому это кажется субоптимальным.
function mergeProps(stateProps, dispatchProps, ownProps) {
const { user } = stateProps.authReducer;
const { dispatch } = dispatchProps;
return {
...ownProps,
...dispatchProps,
...stateProps,
onSubmit: (values) => {
const { name, description } = values;
const thing = new Thing(name, description, []);
dispatch(createNewThing(thing, user.id));
}
}
3 Скопировать свойства состояния в поля редукционной формы, которые не отображаются на любые элементы управления в компоненте формы. Это гарантирует, что они доступны в параметре values
, переданном на handleSubmit
. Это похоже на хак.
Там должен быть лучший способ!
Есть ли лучший способ?