当前位置:首页 > 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页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 编写组件代码 在 s…

react 如何继承

react 如何继承

在React中,组件继承并非推荐的设计模式(官方更推崇组合优于继承),但技术上仍可通过以下方式实现类似效果: 使用ES6类继承 通过extends关键字继承父组件类,子组件可访问父组件的生命…

vue加载动画实现

vue加载动画实现

Vue 加载动画的实现方法 在 Vue 中实现加载动画可以通过多种方式完成,以下是一些常见的方法: 使用 CSS 动画 通过 CSS 定义动画效果,结合 Vue 的动态类绑定或条件渲染控制动画的显示…

react如何验证

react如何验证

表单验证方法 在React中验证表单数据通常使用以下几种方式: 内置HTML5验证 利用HTML5原生表单验证属性如required、pattern等,结合form.noValidate属性禁用浏览…

react如何下载

react如何下载

安装 React 的步骤 通过 npm 或 yarn 安装 React,确保已安装 Node.js(版本建议 ≥ 14.0.0)。打开终端或命令行工具,运行以下命令: npx create-reac…

react如何分

react如何分

React 分页实现方法 在 React 中实现分页功能可以通过多种方式完成,以下是几种常见的方法: 使用状态管理分页数据 在组件内部维护当前页码和每页数据量的状态,通过计算切片数据实现分页。…