Мы используем react-router-redux для маршрутизации в нашем приложении.
<Route path='/users/:userId' component={SomeComponent} />
Таким образом, SomeComponent
получит userId
в своих параметрах соответствия. Проблема в том, что для того, чтобы дочерние элементы SomeComponent
получили идентификатор, мы должны передать его в качестве реквизита от родителя к дочернему. Насколько это возможно, мы стараемся избегать передачи реквизита от родителя к дочернему, предпочитая использовать контейнеры и хранилище избыточности.
Чтобы предоставить параметры дочерним элементам, мы рассматриваем возможность SomeComponent
отправки действия при изменении его реквизита. Удобный способ сделать это:
const mapDispatchToProps = (dispatch: Dispatch<IState>, props: IPropsFromParent): IPropsFromDispatch => {
dispatch(ActionCreators.updateShowingUserId({
userId: props.match.params.userId,
}))
return {
anotherAction: () => {
dispatch(ActionCreators.doOtherStuff())
}
}
}
Таким образом, всякий раз, когда компонент получает новый userId
от маршрутизатора, он будет обновлять значение в хранилище. Компоненты, которые рендерятся глубже в дереве, но сами не подключены к маршрутизатору, могут использовать это значение для условного рендеринга и т. д.
Однако мы обеспокоены тем, что это может быть плохой практикой по неизвестным нам причинам. Известно, что вызов setState
в функции рендеринга реагирующего компонента запрещен. Интересно, есть ли какое-то подобное конкретное ограничение на вызов диспетчеризации в mapDispatchToProps
.
Плохо ли отправлять действия в mapDispatchToProps, и если да, то почему?