Недавно я реализовал ReactTransitionsGroup для анимации всех переходов моей страницы с помощью react router (компонент Velocty — это просто оболочка ReactTransitionsGroup, поэтому на практике это то же самое):
render () {
return (
<div className="app-layout">
<NavBar location={this.props.location} />
<VelocityTransitionGroup enter={{ animation: 'pageTransitionIn' }} leave={{ animation: 'pageTransitionOut' }}>
{React.cloneElement(this.props.children, {
key: this.props.location.pathname,
})}
</VelocityTransitionGroup>
<TimeOutModal />
<Notifications />
</div>
);
}
В моей форме регистрации у меня есть компонент формы, который, как только запрос регистрации успешно ответил, props обновится, и компонент запустит перенаправление на следующий шаг регистрации.
class SignUp extends Component {
componentDidUpdate () {
if (this.props.signup.success) {
hashHistory.push('/confirm-signup')
}
}
render() {//....//}
}
Проблема заключается в том, как только перенаправление запускается, я вхожу в бесконечный цикл, так как ReactTransitionsGroup заставляет компонент оставаться в течение нескольких милисекунд, снова вызывая перенаправление.
Мне удается «исправить» это, используя setTimeout на редиректе, но я не нахожу это решение действительно элегантным:
componentDidUpdate () {
if (this.props.signup.success) {
setTimeout(() => {
hashHistory.push('/confirm-signup')
}, 500)
}
}
Вы находите какие-либо другие решения этой проблемы?
Заранее спасибо!
Обычно я бы сказал, чтобы сделать перенаправление в обработчике формы. Исходя из того, что
signup.success
это prop, я предполагаю, что вы используете какой-то глобальный магазин, и вам придется переписать кучу кода, чтобы сделать это.Редактировать
В компонент можно добавить
hasTransitioned
свойство, которое задается при переходе.