Плохо ли отправлять действия из mapDispatchToProps и почему?

Мы используем 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, и если да, то почему?


person Ziggy    schedule 12.12.2017    source источник


Ответы (1)


Поскольку диспетчеризация будет выполняться каждый раз, когда обновляется редукс store (и реквизиты компонента меняются), не было бы хорошей идеей отправлять что-то внутри функций mapStateToProps, mapDispatchToProps или mergeProps, поскольку вы бы перезаписали предыдущее значение с помощью по умолчанию. Вы должны добавить значение, которое вы отправляете, в начальное хранилище, когда это возможно, или отправить значения по умолчанию от родителя, который управляет компонентом.

Документация для ReactRedux.connect

person Siggy    schedule 12.12.2017
comment
В приведенном выше примере кода вы можете быть удивлены, узнав, что mapStateToProps запускается дважды, а mapDispatchToProps запускается только один раз. Я подозреваю, что mapDispatchToProps перезапускается только при изменении реквизита, а не состояния. - person Ziggy; 12.12.2017
comment
Верный. Если mapDispatch определен с одним аргументом (dispatch), он будет запущен один раз при создании экземпляра компонента. Если он определен с двумя аргументами ((dispatch, ownProps)), он будет запускаться при создании экземпляра, а также всякий раз, когда обновляются реквизиты компонента-оболочки. - person markerikson; 12.12.2017
comment
@markerikson Да! Итак, есть ли проблема с диспетчеризацией действий в mapDispatch? Что-то вроде этого может вызвать бесконечный цикл или вы не должны прерывать цикл рендеринга с обновлениями состояния? Я обновил свой вопрос нашим конкретным вариантом использования, если это поможет. Спасибо! - person Ziggy; 12.12.2017
comment
Извините, я собираюсь понизить ваш ответ: ваш ответ - это не очень хорошая идея, ... поскольку вы перезапишете предыдущее значение значением по умолчанию. Это неправда, так что это не может быть ответом. Тем не менее, спасибо за ваши усилия! - person Ziggy; 13.03.2018
comment
PS Я подозреваю, что вы правы, и что это плохая идея (поэтому я и спросил в первую очередь), но мне нужно знать, почему это плохая идея, чтобы решить, стоит ли делать это или нет. - person Ziggy; 13.03.2018