[email protected](42)路由v5.x(7)常见应用场景(4)- 路由切换动画

目录

通过一个例子来说明如何实现。

1,实现路由切换

基础样式

App.jsx

js 复制代码
import { BrowserRouter as Router, Route, NavLink } from "react-router-dom";
import { Home, News, Goods } from "./page";
import "./App.css";

export default function App() {
    return (
        <div className="container">
            <Router>
                <div className="nav-box">
                    <NavLink to="/" exact>
                        首页
                    </NavLink>
                    <NavLink to="/news">新闻页</NavLink>
                    <NavLink to="/goods">商品页</NavLink>
                </div>
                <div className="page-box">
                    <Route path="/" exact component={Home}></Route>
                    <Route path="/news" component={News}></Route>
                    <Route path="/goods" component={Goods}></Route>
                </div>
            </Router>
        </div>
    );
}

App.css

css 复制代码
.container {
    margin: 0 auto;
    width: 400px;
}

.nav-box {
    background-color: lightblue;
    line-height: 3;
    text-align: center;
}

.nav-box a {
    display: inline-block;
    margin: 10px;
}

.nav-box a.active {
    color: salmon;
}

.page-box {
    height: 200px;
    outline: 1px solid salmon;
}

page.jsx

js 复制代码
import React from "react";
import "./page.css";

export function Home() {
    return <div className="page home">Home</div>;
}

export function News() {
    return <div className="page news">News</div>;
}

export function Goods() {
    return <div className="page goods">Goods</div>;
}

page.css

css 复制代码
.page {
    height: 100%;
    text-align: center;
}

.home {
    background-color: lightblue;
}

.news {
    background-color: lightgreen;
}

.goods {
    background-color: lightyellow;
}

显示效果:

2,使用 CSSTransition 添加动画

CSSTransition 的使用参考 [email protected](33)动画(上)

先看最终效果

  1. 可以看到路由页面(一开始)是重叠在一起的,所以需要使用绝对定位来实现。
  2. 动画过程中,对应的路由页面在动画开始前,应该是未加载的状态。同理,退出后应该是卸载状态。所以在 CSSTransition 组件上需要添加 mountOnEnterunmountOnExit

完整代码:

1,自定义动画组件 TransitionRoute.jsx

match 属性未匹配时为 null

js 复制代码
import React from "react";
import { Route } from "react-router-dom";
import { CSSTransition } from "react-transition-group";
import "animate.css";

export default function TransitionRoute(props) {
    const { component: Comp, ...rest } = props;
    return (
        <Route {...rest}>
            {({ match }) => {
                return (
                    <CSSTransition
                        in={!!match}
                        timeout={500}
                        mountOnEnter
                        unmountOnExit
                        classNames={{
                            enterActive: "animate__fadeInRight",
                            exitActive: "animate__fadeOutLeft",
                        }}
                    >
                        <Comp></Comp>
                    </CSSTransition>
                );
            }}
        </Route>
    );
}

2,App.jsx

只需要将 Route 替换为 TransitionRoute 即可。

3,样式改动

App.css,父级元素添加相对定位。

css 复制代码
.page-box {
    position: relative;
}

page.jsx 。因为想使用 animate.css ,所以对进行动画的元素添加公共样式 animate__animated

js 复制代码
import React from "react";
import "./page.css";

export function Home() {
    return <div className="page animate__animated home">Home</div>;
}

export function News() {
    return <div className="page animate__animated news">News</div>;
}

export function Goods() {
    return <div className="page  animate__animated goods">Goods</div>;
}

page.css,添加绝对定位。

css 复制代码
.page {
    position: absolute;
    left: 0;
    top: 0;
    height: 100%;
    width: 100%;
}

3,注意点

  • 当不使用 Swtich 组件时,每个Route 组件都会加载,只是不显示而已。所以可实现切换路由的动画。
  • 使用 Swtich 组件后,因为它只会加载匹配到的 Route 组件,其他Route 组件并没有加载,所以无法完成退出进入动画

在 React 的插件中可以检查下:

不使用 Switch 组件时,3个 Route 组件都会渲染,只是未匹配的不展示:

使用 Switch 后,只会渲染一个 Route 组件:


以上。

相关推荐
东锋1.32 分钟前
前端动画库 Anime.js 的V4 版本,兼容 Vue、React
前端·javascript·vue.js
满怀101515 分钟前
【Flask全栈开发指南】从零构建企业级Web应用
前端·python·flask·后端开发·全栈开发
小杨升级打怪中42 分钟前
前端面经-webpack篇--定义、配置、构建流程、 Loader、Tree Shaking、懒加载与预加载、代码分割、 Plugin 机制
前端·webpack·node.js
Yvonne爱编码1 小时前
CSS- 4.4 固定定位(fixed)& 咖啡售卖官网实例
前端·css·html·状态模式·hbuilder
SuperherRo1 小时前
Web开发-JavaEE应用&SpringBoot栈&SnakeYaml反序列化链&JAR&WAR&构建打包
前端·java-ee·jar·反序列化·war·snakeyaml
大帅不是我1 小时前
Python多进程编程执行任务
java·前端·python
前端怎么个事1 小时前
框架的源码理解——V3中的ref和reactive
前端·javascript·vue.js
Ciito1 小时前
将 Element UI 表格元素导出为 Excel 文件(处理了多级表头和固定列导出的问题)
前端·vue.js·elementui·excel
不爱吃饭爱吃菜2 小时前
uniapp微信小程序一键授权登录
前端·javascript·vue.js·微信小程序·uni-app
heart000_12 小时前
从零开始打造个人主页:HTML/CSS/JS实战教程
javascript·css·html