组件显示,路由切换-过渡动画

1.安装过渡动画模块npm install react-transition-group --save;

2.在需要执行过渡的组件中导入动画模块;

import{ CSSTransition } from "react-transition-group"

3.在需要过渡的标签外层添加CSSTranstion组件

        <CSSTransition in={bool} timeout={2000} classNames = "myFade">

                <div></div>

        </CSSTransition>

4.在组件的css中通过class设置入场和出场动画

            .myfade-enter  .myfade-enter-active   .myfade-enter-done

            .myfade-exit  .myfade-exit-active   .myfade-exit-done

入场和出场的class样式要按顺序写,动画开始和结束的顺序不能颠倒;

需要在index.js中关闭严格模式,删除<React.StrictMode>

enter-active和exit-active中要写过渡结束状态才有效;

 1.组件显示切换 添加过渡动画

// 函数式组件
import Star from '../../components/Star/Star';
import { useState,useEffect } from 'react';
import {CSSTransition} from 'react-transition-group';
import './Find.css'
function Find() {
    // 定义函数式组件的状态和修改函数及初始值
    let [age,setAge] = useState(19);

    let [arr,setArr] = useState([]);
    let [show,setShow] = useState(true);
    return ( 
        <div className='Find'>
            发现
            <hr />
            <button onClick={()=>{setShow(!show)}}>点击显示或者隐藏组件</button>
            {/* in属性式控制显示和隐藏的字段 timeout是要与过渡动画的一个时长保持一致 className 动画效果的类*/}
            <CSSTransition in={show} timeout={2000} classNames='ani'>
                <Star age={age} ageFun={setAge}></Star>
            </CSSTransition>
        </div>
     );
}

export default Find;

/* 入场开始时 */
.ani-enter{
    transform: translateX(-100vw);
}
/* 入场进行时 transition设置的时间最好与CSSTransition的timeout属性设置的值一样,也可以比哪个小
    把最终的状态添加ani-enter-active和ani-enter-done这两个类
*/
.ani-enter-active{
    transition: 1s;
    transform: translateX(0);
}
/* 入场结束时 */
.ani-enter-done{
    transform: translateX(0);
}
/* 离场动画过程 
    离场开始时 */
.ani-exit{
    transform: translateY(0);
}
/* 入场进行时 transition设置的时间最好与CSSTransition的timeout属性设置的值一样,也可以比哪个小
    把最终的状态添加ani-enter-active和ani-enter-done这两个类
*/
.ani-exit-active{
    transition: 1s;
    transform: translateY(100vh);
}
/* 入场结束时 */
.ani-exit-done{
    transform: translateY(100vh);
}
.Find{
    background-color: aqua;
    height: 100vh;
}

去index.js中将严格模式注释掉;

// <React.StrictMode>
    // 在app外加上Router就相当于vue在入口文件注入全局路由器 
    <Router>
      <App />
    </Router>
  // </React.StrictMode> 

2.给前端路由界面切换添加过渡动画

如何获取路由对象信息呢:

1.在函数式组件通过hookApi进行获取;

 import {useLocation,Navigate} from "react-router-dom"

 useLocation 获取路由信息对象

Navigate 用来跳转的

// 1.设置路由的模式:历史模式或者哈希模式:BrowserRouter
// 2.设置页面的配置信息的组件,Router组件等同于vue当中路由页面对象;
// as 生成一个别名 ,别名为Router
//  Routes 组件包括所有Route组件 类似vue数组结构,包含所有的单个组件对象
// NavLink 跳转的组件 类似与vue中router link
// 没有routerVIew ,react中把路由文件index.js导出来就是路由的出口容器,类似与router-view
import { BrowserRouter as Router, Route, Routes,useLocation,Navigate } from "react-router-dom";
// 导入页面
import Find from "../pages/Find/Find";
// 组件
import Home from "../pages/Home/Home.jsx";
import Page404 from "../pages/Page404/Page404.jsx";

import './index.css';

// 1.导入需要的组件 CSSTransition 过渡组件 TransitionGroup 动画组
import { CSSTransition, TransitionGroup } from "react-transition-group";

// 导出路由组件 作为页面的出口组件
export default function Index() {
    const location = useLocation(); //获取路由信息;
    console.log(location)
    return (
        <div>
            {/* 2添加动画组 */}
            <TransitionGroup>
                {/* 3添加动画效果组件 unmountOnExit是离开的时候组件卸载 key属性控制在不同的路由界面的显示和隐藏*/}
                <CSSTransition timeout={1000} unmountOnExit classNames='index_ani' key={location.pathname}>
                    <Routes location={location}>
                        {/* path:路由地址  element对应的式路由页面*/}
                        <Route path="/" element={<Home />}></Route>
                        <Route path="/find" element={<Find />}></Route>
                        {/* 重定向 */}
                        <Route path="/abc" element={<Navigate to='/' replace/>}></Route>

                        {/* 404界面,所有的路由界面都能匹配的界面 */}
                        <Route path="*" element={<Page404 />}></Route>
                    </Routes>
                </CSSTransition>
            </TransitionGroup>
        </div>
    )
};

 

/* 入场开始时 */
.index_ani-enter{
    transform: translateX(-100vw) ;
}
/* 入场进行时 transition设置的时间最好与CSSTransition的timeout属性设置的值一样,也可以比哪个小
    把最终的状态添加index_index_ani-enter-active和index_ani-enter-done这两个类
*/
.index_ani-enter-active{
    transition: 1s;
    transform: translateX(0);
}
/* 入场结束时 */
.index_ani-enter-done{
    transform: translateX(0);
    opacity: 1;
}
/* 离场动画过程 
    离场开始时 */
.index_ani-exit{
    transform: translateX(0);
}
/* 入场进行时 transition设置的时间最好与CSSTransition的timeout属性设置的值一样,也可以比哪个小
    把最终的状态添加index_ani-enter-active和index_ani-enter-done这两个类
*/
.index_ani-exit-active{
    transition: 1s;
    transform: translateX(100vw);
}
/* 入场结束时 */
.index_ani-exit-done{
    transform: translateX(100vw);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值