React useEffect запускается после последующих рендеров, хотя зависимость от Redux не изменилась - PullRequest
4 голосов
/ 02 мая 2020

У меня есть компонент-функция React с дорогим побочным эффектом:

  useEffect(() => {
    doExpensiveSideEffect(reduxProp);
  }, [reduxProp]);

reduxProp - это свойство, которое обслуживается извне через Redux-коннектор. На этот вопрос я надеюсь, что точное происхождение reduxProp не имеет значения.

Моя проблема в том, что doExpensiveSideEffect запускается чаще, чем необходимо.

  • Он запускается после первый рендеринг, который в порядке.
  • Он запускается всякий раз, когда reduxProp получает переназначение, что тоже нормально.
  • Однако он также запускается после последующих рендеров, даже если reduxProp этого не произошло изменить!

Это приводит к моему вопросу: Как я могу гарантировать, что doExpensiveSideEffect работает тогда и только тогда, когда reduxProp был переназначен, независимо от количества последующих рендеров?

РЕДАКТИРОВАТЬ:

Стоит отметить, что компонент заключен в компонент Router-Higher-Order-Component. Маршрутизация контролируется IonReactRouter-Component. Я предполагаю, что IonReactRouter генерирует несколько экземпляров одного и того же дочернего компонента, что может быть причиной root этой проблемы.

См. https://ionicframework.com/docs/react/navigation для получения дополнительной информации о IonReactRouter.

Кроме того, reduxProp передается через connect -функцию react-redux. Между ними пользовательский «селектор» используется для выбора reduxProp из глобального AppState. Следующий код демонстрирует путь от глобального AppState к вышеупомянутому useEffect:

const OuterComponent = withRouter(
  connect<StateProps, DispatchProps, OwnProps, AppState>(
    (state: AppState, ownProps: OwnProps) => ({
      reduxProp: selectPartOfState(state, ownProps),
    }),
    {}
  )(InnerComponent)
);

Now InnerComponent получает reduxProp в своих реквизитах и ​​включает в себя вышеупомянутый useEffect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...