当前位置:首页 > React

react实现卸载动画

2026-01-26 10:59:09React

使用 CSS 和 React 实现卸载动画

在 React 中实现卸载动画,可以通过结合 CSS 动画和 React 的生命周期方法或 Hooks 来完成。以下是几种常见的方法:

使用 CSS Transition 和 React 状态

定义一个 CSS 类,包含过渡效果:

.fade-exit {
  opacity: 1;
}
.fade-exit-active {
  opacity: 0;
  transition: opacity 300ms ease-out;
}

在 React 组件中,通过状态控制卸载动画:

import { useState } from 'react';

function AnimatedComponent() {
  const [isVisible, setIsVisible] = useState(true);

  return (
    <div>
      {isVisible && (
        <div className="fade-exit fade-exit-active">
          Content to animate out
        </div>
      )}
      <button onClick={() => setIsVisible(false)}>
        Trigger Unmount Animation
      </button>
    </div>
  );
}

使用 React Transition Group

React Transition Group 是一个流行的库,专门用于管理组件的进入和退出动画。

安装 React Transition Group:

react实现卸载动画

npm install react-transition-group

使用 CSSTransition 组件:

import { CSSTransition } from 'react-transition-group';
import { useState } from 'react';

function AnimatedComponent() {
  const [show, setShow] = useState(true);

  return (
    <div>
      <CSSTransition
        in={show}
        timeout={300}
        classNames="fade"
        unmountOnExit
      >
        <div>Content to animate out</div>
      </CSSTransition>
      <button onClick={() => setShow(false)}>
        Trigger Unmount Animation
      </button>
    </div>
  );
}

对应的 CSS:

.fade-enter {
  opacity: 0;
}
.fade-enter-active {
  opacity: 1;
  transition: opacity 300ms;
}
.fade-exit {
  opacity: 1;
}
.fade-exit-active {
  opacity: 0;
  transition: opacity 300ms;
}

使用 Framer Motion

Framer Motion 是一个更高级的动画库,提供更丰富的动画功能。

react实现卸载动画

安装 Framer Motion:

npm install framer-motion

实现卸载动画:

import { motion, AnimatePresence } from 'framer-motion';
import { useState } from 'react';

function AnimatedComponent() {
  const [show, setShow] = useState(true);

  return (
    <div>
      <AnimatePresence>
        {show && (
          <motion.div
            initial={{ opacity: 1 }}
            exit={{ opacity: 0 }}
            transition={{ duration: 0.3 }}
          >
            Content to animate out
          </motion.div>
        )}
      </AnimatePresence>
      <button onClick={() => setShow(false)}>
        Trigger Unmount Animation
      </button>
    </div>
  );
}

自定义 Hook 实现卸载动画

创建一个自定义 Hook 来处理动画逻辑:

import { useState, useEffect } from 'react';

function useUnmountAnimation(duration = 300) {
  const [isMounted, setIsMounted] = useState(true);
  const [shouldRender, setShouldRender] = useState(true);

  useEffect(() => {
    if (!isMounted) {
      const timer = setTimeout(() => {
        setShouldRender(false);
      }, duration);
      return () => clearTimeout(timer);
    }
  }, [isMounted, duration]);

  return [shouldRender, setIsMounted];
}

function AnimatedComponent() {
  const [shouldRender, setIsMounted] = useUnmountAnimation();

  return (
    <div>
      {shouldRender && (
        <div className={!isMounted ? 'fade-out' : ''}>
          Content to animate out
        </div>
      )}
      <button onClick={() => setIsMounted(false)}>
        Trigger Unmount Animation
      </button>
    </div>
  );
}

对应的 CSS:

.fade-out {
  animation: fadeOut 0.3s ease-out forwards;
}

@keyframes fadeOut {
  from { opacity: 1; }
  to { opacity: 0; }
}

以上方法可以根据项目需求和技术栈选择合适的实现方式。React Transition Group 和 Framer Motion 提供了更完整的解决方案,而自定义 CSS 和 Hooks 则更适合简单的动画需求。

标签: 动画react
分享给朋友:

相关文章

如何评价react native

如何评价react native

React Native 的优势 跨平台开发效率高 React Native 允许开发者使用 JavaScript 和 React 编写代码,同时生成 iOS 和 Android 应用,大幅减少开发成…

react如何鉴定

react如何鉴定

React 鉴权方法 基于路由的鉴权 在 React 中,可以通过封装路由组件实现鉴权。使用 react-router-dom 检查用户是否登录,未登录则跳转至登录页。 import { Rou…

vue实现gif动画

vue实现gif动画

Vue 中实现 GIF 动画的方法 在 Vue 中实现 GIF 动画可以通过多种方式完成,具体取决于需求和使用场景。以下是几种常见的方法: 直接使用 <img> 标签加载 GIF 最简…

电脑如何安装react

电脑如何安装react

安装 Node.js 和 npm React 依赖于 Node.js 和 npm(Node Package Manager)。从 Node.js 官网下载并安装最新稳定版本,安装完成后会自动包含 np…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在…