Задержка перехода по ссылке React Router для добавления пользовательского компонента анимации

#javascript #reactjs #react-router #react-router-dom

#javascript #reactjs #react-маршрутизатор #react-router-dom

Вопрос:

Я работаю над проектом, в котором мне нужна анимация перехода страницы, и, похоже, не могу найти способ отложить немедленное изменение страницы компонентом ссылки маршрутизатора React. Начало анимации сдвигает сетку над этой страницей на cover, затем, как только страница загружена, должна отображаться выбранная страница.

В настоящее время это делается путем установки значения isLoading в true при щелчке по ссылке, а затем установки значения isLoading в false при подключении следующего компонента. Это работает нормально, за исключением того, что текущая страница не остается на экране во время начальной настройки экрана.

 class tests extends Component {
    constructor(props) {
        super(props);
        this.state = {
            isLoading: true,
            isDoneLoading: false,
        };
    }

    changeIsLoading = (newVal) => {
        this.setState({ isLoading: newVal });
    };

    changeIsDoneLoading = (newVal) => {
        this.setState({ isDoneLoading: newVal });
    };

    navLoading = () => {
        this.setState({ isDoneLoading: false, isLoading: true });
    };

    render() {
        return (
            <div className='test'>
                <Navbar navLoading={this.navLoading} />
                {!this.state.isDoneLoading amp;amp; (
                    <LoadingScreen
                        isLoading={this.state.isLoading}
                        isDoneLoading={this.state.isDoneLoading}
                        changeIsDoneLoading={this.changeIsDoneLoading}
                    />
                )}
                <Route
                    render={({ location }) => (
                        <Switch>
                            <Route
                                exact
                                path='/page1'
                                render={(routeProps) => (
                                    <Page1
                                        isLoading={this.state.isLoading}
                                        changeIsLoading={this.changeIsLoading}
                                    />
                                )}
                            />
                            <Route
                                exact
                                path='/page2'
                                render={(routeProps) => (
                                    <Page2
                                        isLoading={this.state.isLoading}
                                        changeLoading={this.changeLoading}
                                    />
                                )}
                            />
                        </Switch>
                    )}
                />
            </div>
        );
    }
}
  

Грубый код, прошу прощения за это!

Есть ли способ отложить отображение маршрута до того, как будет загружена следующая страница? Кажется, я не могу найти чистый способ сделать это и был бы признателен за любую помощь.

Заранее благодарю вас.

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

1. Попытка справиться с этим самостоятельно может оказаться немного запутанной. Рассматривали ли вы возможность использования пакета framer-motion? Это широко используемое и простое решение для подобных вещей. В настоящее время я использую его во многих приложениях, и он творит чудеса. Обрабатывает все анимации монтирования / размонтирования за вас, включая изменения маршрута.

2. @Chris Есть ли у framer-motion способ отложить эту анимацию? Я планировал проверить framer после завершения этого проекта, но если это поможет с анимациями, подобными этой, я мог бы просто сразу перейти.

3. Я все еще довольно новичок в framer, поэтому я не уверен во всех возможностях, но в целом он довольно мощный. Единственный вид «задержки», который я видел до сих пор, — это задержка на то, сколько секунд вы хотите, чтобы анимация подождала перед запуском. Существуют всевозможные методы событий и то, чего нет, к которым вы также можете подключиться.

4. @Chris Я проверю это, за это я ценю помощь!