Перейти к содержанию

Использование анимаций с React Router

Люди часто хотят анимировать переходы маршрутов, что может привести к восхитительному UX при умеренном использовании. Первым инстинктом может быть использование обертывания всех маршрутов в TransitionGroup, но такой подход требует хаков и легко разваливается при использовании с более хитрыми компонентами React Router, такими как Redirect. Вы должны использовать CSSTransition для каждого маршрута и управлять их in prop самостоятельно.

Основной проблемой является переход exit, поскольку React Router переходит на новый маршрут мгновенно, поэтому нам нужно сохранить старый маршрут достаточно долго для перехода из него. К счастью, пропс Route children также принимает функцию, которую не следует путать с пропсом render! В отличие от свойства render, функция children выполняется независимо от того, найден ли маршрут или нет. React Router передает объект, содержащий объект match, который существует, если маршрут совпадает, иначе он null. Это позволяет нам управлять in prop CSSTransition на основе наличия match.

При выходе из перехода содержимое маршрутов будет оставаться до их исчезновения, что может создать некоторые проблемы с оформлением. Убедитесь, что маршруты не влияют на расположение друг друга, например, вы можете удалить их из потока документа, используя абсолютное или фиксированное позиционирование.

При использовании React Transition Group с React Router убедитесь, что вы не используете компонент Switch, поскольку он выполняет только первый подходящий Route. Это сделает переход выхода невозможным, так как выходящий маршрут больше не будет соответствовать текущему URL и функция children не будет выполнена.

Пример

Комментарии