leiwuhen-67's blog leiwuhen-67's blog
首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)

我的公众号

首页
    • 《Vue》笔记
    • 《React》笔记
    • 《NodeJs》笔记
    • 《CSS》笔记
    • 《Redis》笔记
    • 基础入门
    • 《Mock》笔记
    • 《MySQL》笔记
    • 《Git》相关
影音视听
收藏
关于
GitHub (opens new window)
  • React

    • 使用React脚手架快速搭建项目
    • hooks之useEffect
    • React之事件绑定及简写方式
    • React之props传值并对其进行限制
    • React之Refs的基本使用
    • React之生命周期钩子
    • React之key的使用
    • React之代理服务器配置
    • React之封装全局Loading组件
    • React之消息的发布-订阅(pubsub-js)
    • React之Redux的基本使用
    • React之react-redux的基本使用
    • React之redux的数据持久化存储
    • React之路由懒加载
    • React之Render Props的使用
    • React之createBrowserRouter
    • React之路径别名@配置
    • React之craco打包优化配置
    • React之项目国际化
    • React之postcss-pxtorem移动端适配
    • React之使用vite创建项目
    • React之ts类型标注汇总
    • React之使用 ant design搭建后台管理之踩坑
    • React之路由切换动画
    • React之使用vite创建组件库并发布到npm
    • React之项目打包部署到nginx
    • React之自定义组件添加className与style
  • React Native

  • 《React》笔记
  • React
心欲无痕
2024-07-17

React之路由切换动画

最近在用 React + Ant Design 搭建一个后台管理的模板,想着之前用 vue 的时候,在路由切换时都增加了一个动效,用 React 能不能也增加一个类似的动效呢?
说干就干,然而,令人犯难的是,vue 是自带 Transition 组件,所以加动效很方便,React 就需要自己手动实现了。
第一念头,当然是看看有没有成熟的插件来帮助实现,搜了下,网上都是说使用 react-transition-group 这个插件来实现,我也照着实现了一下,发现有 bug,切换的动效时灵时不灵的,有时候会报错,刷新一下又莫名的好了,而且控制台也报错。
挣扎了一下,于是放弃了使用这个插件,于是,想着能不能不用插件来实现呢,在折腾一番之后,终于实现效果了,特此记录下。

1、创建一个组件来实现动画

import './PageTransition.css'

const PageTransition = ({ children }: { children: React.ReactNode }) => {
  const [displayChildren, setDisplayChildren] = useState(children);
  const [transitionStage, setTransitionStage] = useState('slideIn');
  const location = useLocation();

  useEffect(() => {
    setTransitionStage('slideOut');
  }, [location]);

  useEffect(() => {
    if (transitionStage === 'slideOut') {
      setTimeout(() => {
        setDisplayChildren(children);
        setTransitionStage('slideIn');
      }, 300); // 动画持续时间
    }
  }, [transitionStage, children]);

  return (
    <div className={`page ${transitionStage}`}>
      {displayChildren}
    </div>
  );
};

export default PageTransition;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

PageTransition.css 样式代码

.page {
  transition: all 0.3s ease-in-out;
}

.slideIn {
  opacity: 1;
  transform: translateX(0);
}

.slideOut {
  opacity: 0;
  transform: translateX(-200px);
}
1
2
3
4
5
6
7
8
9
10
11
12
13

2、在需要使用动效的地方用这个组件将其包裹起来。对于后台管理而言,当然是使用该组件将 Outlet 元素包裹起来

import PageTransition from '@/components/PageTransition'

<PageTransition><Outlet/></PageTransition>
1
2
3

至此,一个粗糙的路由切换动效就已经形成了,可以根据自己需要修改 css 里的样式以实现不同的动效

编辑 (opens new window)
上次更新: 3/4/2025, 5:46:30 PM
React之使用 ant design搭建后台管理之踩坑
React之使用vite创建组件库并发布到npm

← React之使用 ant design搭建后台管理之踩坑 React之使用vite创建组件库并发布到npm→

Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式