umi脚手架环境下 实现H5页面路由转场动画

环境介绍

umi 是一个可插拔的企业级 react 应用框架。我们使用 react-transition-group 动画库来实现路由转场动画

核心思路

  1. 利用 umi 提供的 layouts 实现全局布局,在路由外面套的一层路由。
  2. 利用 react-transition-group 动画库提供的钩子函数,监听到页面退出与进入状态
  3. 根据提供的钩子 实现我们的动画

核心代码所在目录中位置

在这里插入图片描述

核心代码的讲解

  1. layouts 下的 index.ts 文件
import React from 'react';
// 高阶组件需要用withRouter包裹一下
import withRouter from 'umi/withRouter';
// 引入动画库的俩个组件
import { TransitionGroup, CSSTransition } from 'react-transition-group';

// 根据前进还是后退显示不同的转场动画效果
const ANIMATION_MAP: any = {
  PUSH: 'forward',
  POP: 'back'
};

export default withRouter(({location, children, history}: any) => {
  return (
     // 这个组件的详细应用 见官网 这里就直接写现成的了
    <TransitionGroup childFactory={child => React.cloneElement( child, {classNames: ANIMATION_MAP[history.action]})}>
      <CSSTransition key={location.pathname} timeout={300}>
        {children}
      </CSSTransition>
    </TransitionGroup>
  );
});
  1. css3 animation文件
/**
 *  页面转场动画 需要导入到 global.less 中
 */

// 动画开始的时候 页面一定要定位住 不然页面组件的布局是上下布局 导致动画效果不显示
.main {
  position: fixed;
  top: 0;
  width: 100vw;
  min-height: 100vh;
  background: white;
}

.forward-enter {
  &:extend(.main);
  opacity: 0;
  transform: translateX(100%);
}

.forward-enter-active {
  &:extend(.main);
  opacity: 1;
  transform: translateX(0);
  transition: all 300ms ease-in;
}

.forward-exit {
  &:extend(.main);
  opacity: 1;
  transform: translateX(0);
}

.forward-exit-active {
  &:extend(.main);
  opacity: 0;
  transform: translateX(-100%);
  transition: all 300ms ease-in;
}

.back-enter {
  &:extend(.main);
  opacity: 0;
  transform: translateX(-100%);
}

.back-enter-active {
  &:extend(.main);
  opacity: 1;
  transform: translateX(0);
  transition: all 300ms ease-in;
}

.back-exit {
  &:extend(.main);
  opacity: 1;
  transform: translateX(0);
}

.back-exit-active {
  &:extend(.main);
  opacity: 0;
  transform: translate(100%);
  transition: all 300ms ease-in;
}

效果图

在这里插入图片描述

gitHub 地址

https://github.com/zhengmenghuang/umi-route-animation

umi3 demo

https://blog.csdn.net/qq_20059455/article/details/107342765

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值