umi路由切换动画的实现

该文详细介绍了如何利用umi框架和react-transition-group库创建路由跳转时的动画效果。首先搭建umi项目,然后安装插件,创建layouts文件夹及所需文件,编写index.tsx和index.less代码以定义不同路由状态的动画,接着在pages文件夹中创建页面并实现路由跳转,最后在umirc.ts中配置路由。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

准备工作

node -v查看版本
检查是否有yarn 或者npm

实现步骤

1. 搭建umi脚手架

创建一个文件夹,cmd进入,输入:

yarn create @umijs/umi-app

2. 下载完成需要yarn

3. 打开终端,按照react-transition-group插件

npm i react-transition-group
或者
yarn add react-transition-group

4. 在src目录下创建layouts文件夹,并在文件夹下创建两个文件

在这里插入图片描述

5. index.tsx的代码

import React, { useState, useEffect } from 'react'
import { TransitionGroup, CSSTransition } from 'react-transition-group'
import { history as Router, withRouter } from 'umi'
import { Switch } from 'react-router'
import './index.less'
 
const routerType = {
        'POP': 'back',
        'PUSH': 'in',
        'REPLACE': 'in'
    }
 
export default withRouter(({ location, children, history }) => {
return (
   <TransitionGroup style={{height:'100%'}} className='transition_wrapper' childFactory={(child) => (
         React.cloneElement(child, { classNames: routerType[history.action] })
   )}>
      <CSSTransition key={location.pathname} appear timeout={3000}>
         <Switch location={location}>{(children as any)?.props?.children}</Switch>
      </CSSTransition>
    </TransitionGroup>
)
})

6. index.less种的代码

.in-enter-active{  // 入场的过渡状态类
    transition: all 3s;
    transform: translate(0, 0)!important;
  }
   
  .in-enter-done { // 入场的动画的结束状态类
      // opacity: 0.5;
      transform: translate(0, 0) !important;
  }
   
  .in-enter {  // 入场的动画开始状态类
    z-index: 5 !important;
    transform: translate(100%, 0);
  }
   
  .in-exit-active {    // 离场动画
      opacity:0;
      transition: all 3s;
      transform: translate(-100%, 0)!important;
  }
   
  .in-exit {  // 离场动画开始
      // transform: translate(0, 0)!important;
  }
  .in-exit-done { // 离场动画结束
   
  }
   
  // 返回动画
  .back-enter-active{  // 入场的过渡状态类
      transition: all 3s;
      transform: translate(0, 0)!important;
    
    }
  .back-enter-done { // 入场的动画的结束状态类
      // opacity: 0.5;
      transform: translate(0, 0) !important;
  }
   
  .back-enter {  // 入场的动画开始状态类
      z-index: 5 !important;
      transform: translate(-100%, 0);
  }
    
  .back-exit-active {    // 离场动画
      opacity:0;
      transition: all 3s;
      transform: translate(100%, 0)!important;
  }
   
  .back-exit {  // 离场动画开始
      // transform: translate(0, 0)!important;
  }
  .back-exit-done { // 离场动画结束
   
  }

7. 在pages文件种创建自己需要的页面,页面需要体现路由跳转。

在这里插入图片描述

例子:
定义home和user页面。

import React from 'react'
import {history} from 'umi'

export default function home() {
  return (
    <div style={{background:"red",height:"500px"}}>
      <button onClick={() => { history.push('/user') }}>跳转到user页面</button>
    </div>
  )
}

import React from 'react'
import { history } from 'umi'

export default function user() {
  return (
    <div style={{ background: "pink", height: "500px" }}>
      <button onClick={() => { history.push('/scroll') }}>到scroll页面</button>
    </div>
  )
}

8. .umirc.ts中进行路由配置

routes: [
    { path: '/', component: '@/pages/login' }, //登录页面
    //配置了路由动画
    {
      path: "/",
      component: "@/layouts/index",
      wrappers: ['@/pages/wrappers'],
      routes: [
        // home页面
        {
          exact: true, path: '/home', component: '@/pages/animation/home'
        },
        // user页面
        {
          exact: true, path: '/user', component: '@/pages/animation/user'
        },
      ]
    }
  ],

9. 此时路由动画就配置完成了,可以在layouts中定义路由动画,也可以直接在pages中定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏兮颜☆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值