当前位置:首页 > 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
分享给朋友:

相关文章

vue动画实现

vue动画实现

Vue动画实现方法 Vue提供了多种方式实现动画效果,主要通过内置组件和第三方库完成。 使用<transition>组件 Vue内置的<transition>组件可以为元素添…

css3动画在线制作

css3动画在线制作

CSS3 动画在线制作工具 以下是一些常用的在线工具和平台,可以帮助快速生成 CSS3 动画代码,无需手动编写: Animista 网址:https://animista.net/ 特点:提供预设…

react如何更新

react如何更新

更新 React 版本的方法 检查当前 React 版本 运行以下命令查看项目中安装的 React 版本: npm list react 更新 React 及相关依赖 通过 npm 或 yar…

如何记忆react

如何记忆react

理解核心概念 React的核心概念包括组件、状态(state)、属性(props)、生命周期方法(类组件)和钩子(函数组件)。掌握这些基础概念是记忆React的关键。组件是React应用的构建块,分为…

如何选购react

如何选购react

选购 React 相关产品或服务的建议 React 是一个用于构建用户界面的 JavaScript 库,广泛应用于前端开发。以下是选购 React 相关产品(如课程、书籍、工具、组件库等)的参考方法:…

react如何部署

react如何部署

部署 React 应用的常见方法 使用静态服务器部署 React 应用在构建后会生成静态文件,可以直接通过静态服务器部署。常用的静态服务器包括 Nginx、Apache 等。 运行构建命令生成静态文…