Наконец-то я понял, почему у меня такое плохое поведение в Safari Mobile.
В моем приложении есть компонент AppContainer
, который инкапсулирует все мои маршруты
routes.js
<AppContainer location={window.location}>
<Switch>
<Route path="/sign-in" component={SignInContainer} />
</Switch>
</AppContainer>
в котором я экспортирую свой класс по умолчанию
export default withRouter((connect(mapStateToProps, mapDispatchToProps)(AppContainer)));
Оказывается, что в этом компоненте componentDidMount()
был вызван перед всеми вложенными компонентами в моих маршрутах. Первая проблема, которую я решил, добавив translate
в моем экспорте по умолчанию.
Поскольку я использую реагировать-i18следующий с параметрами react: { wait: true }
,
все вложенные дочерние компоненты имеют export default translate(['common'))
.
это означает, что каждый раз, когда монтируется дочерний элемент, он будет ждать загрузки всех локалей перед рендерингом, что не имеет место с AppContainer
, поэтому его componentDidMount
был вызван первым.
Мне просто нужно было добавить
export default withRouter(
translate([])(connect(mapStateToProps, mapDispatchToProps)(AppContainer)),
);
Теперь жизненный цикл был исправлен, мне просто нужно добавить scrollBy на componentDidMount
в AppContainer
, и на этот раз я использовал
AppContainer
componentDidMount() {
setTimeout(() => {
window.scrollTo(0, -5000);
}, 0);
}
, а не через 800 мс.
Надеюсь, это поможет людям, которые сталкиваются с той же проблемой.