Реагирующий маршрутизатор версии 6.0.0-beta0 — анимация переходов маршрутов с помощью TransitionGroup и CSSTransition

#reactjs #react-router #react-router-dom #react-transition-group #reactcsstransitiongroup

#reactjs #react-router #react-router-dom #react-transition-group #reactcsstransitiongroup

Вопрос:

В моем приложении есть два маршрута: Step1 и Step2 и Next кнопка, которая переводит вас из Step1 Step2 в. Я хотел бы анимировать переход между Step1 и Step2 , чтобы, когда пользователь нажимает Next , Step2 он появлялся справа, а Step1 затем исчезал из поля зрения слева.

Это работает в React Router версии 5.2.0 (демонстрационная версия версии 5.2), но не в версии 6.0.0-beta0 (демонстрационная версия версии 6).

  • В демо версии 5.2 при нажатии Next вы можете увидеть, что Step1 переходы выходят и Step2 переходы входят, как и ожидалось.
  • Однако в демо версии 6 при нажатии Next Step1 сразу заменяется на Step2 и к нему применяется переход выхода, так что Step2 , похоже, он входит и выходит одновременно.

Я думаю, это может быть связано с <Routes> компонентом (который является эквивалентом версии <Switch> 6, см. Руководство по миграции здесь).

Согласно документам v5 (строка 48), вы должны передать объект location <Switch> , чтобы «он мог соответствовать старому местоположению при его анимации». <Switch> затем использует этот объект вместо context.location того, чтобы сопоставлять путь (см. Строку 19):

const location = this.props.location || context.location;

…тогда <Routes> как просто считывает местоположение из контекста (см. Строку 532):

let location = useLocation() as Location;

Я думаю, это объясняет поведение в демо версии 6 — вы можете видеть, что исходящий маршрут повторно отображается с <Step1> to <Step2> по мере его выхода, это правильно? Как я могу предотвратить повторный рендеринг?

Комментарии:

1. Похоже, вы нашли текущую открытую проблему. В основном текущая реализация не проверяет location prop и, следовательно, неправильно управляет маршрутом выхода. Существует PR для ее исправления, но, к сожалению, основные разработчики маршрутизаторов React, похоже, находятся в паузе, сосредоточившись на другом проекте.

2. @jymbob да, я не знал об этой проблеме , когда писал здесь. Кто-то предложил использовать пакет исправлений , чтобы исправить это, что хорошо сработало для меня, даже несмотря на то, что исходный код уменьшен.

3. Чтобы исправить это, я включил react-router в качестве одноранговой зависимости в свой package.json и модифицировал /node_modules/react-router/index.js в соответствии с PR . Затем я применил исправление, и анимация перехода сработала, как ожидалось.