React(六)React过渡动画-CSS编写方式
React过渡动画
react-transition-group介绍
- 在开发中,我们想要给一个组件的显示和消失添加某种过渡动画,提高用户体验→可通过react-transition-group实现。
- React曾为开发者提供过动画插件 react-addons-css-transition-group,后由社区维护,形成了现在的 react-transitiongroup。
- 该组件帮助我们实现组件的入场和离场动画。
- 安装方式:
# npm
npm install react-transition-group --save
# yarn
yarn add react-transition-group
react-transition-group主要组件
该插件主要包含四个组件:
Transition:基础组件,用于管理单个组件的进入和退出动画
CSSTransition:基于 <Transition> 的高级组件,它通过添加 CSS 类名来实现动画效果
SwitchTransition:两个组件显示和隐藏切换时,使用该组件
TransitionGroup:将多个动画组件包裹在其中,一般用于列表中元素的动画;
CSSTransition
- 执行过程中的三个状态:appear、enter、exit
- 三种状态对应的CSS样式:
- 开始状态:xxx-appear、xxx-enter、xxx-exit
- 执行动画:xxx-appear-active、xxx-enter-active、xxx-exit-active;
- 执行结束:xxx-appear-done、xxx-enter-done、xxx-exit-done;
3.in:触发进入或者退出状态
- 当in为true时,触发进入状态,会添加-enter、-enter-acitve的class开始执行动画,当动画执行结束后,会移除两个class, 并且添加-enter-done的class;
- 当in为false时,触发退出状态,,会添加-exit、-exit-active的class开始执行动画,当动画执行结束后,会移除两个class,并且添加-enter-done的class;
App.jsx
import React, { createRef, PureComponent } from 'react'
import { CSSTransition } from "react-transition-group"
import "./style.css"export class App extends PureComponent {constructor(props) {super(props)this.state = {isShow: true}this.sectionRef = createRef()}render() {const { isShow } = this.statereturn (<div><button onClick={e => this.setState({isShow: !isShow})}>切换</button>{/* { isShow && <h2>哈哈哈</h2> } */}<CSSTransition nodeRef={this.sectionRef}in={isShow} unmountOnExit={true} classNames="why" timeout={2000}appearonEnter={e => console.log("开始进入动画")}onEntering={e => console.log("执行进入动画")}onEntered={e => console.log("执行进入结束")}onExit={e => console.log("开始离开动画")}onExiting={e => console.log("执行离开动画")}onExited={e => console.log("执行离开结束")}><div className='section' ref={this.sectionRef}><h2>哈哈哈</h2><p>我是内容, 哈哈哈</p></div></CSSTransition></div>)}
}export default App
style.css
/* 进入动画 */
/* .why-appear {transform: translateX(-150px);
}.why-appear-active {transform: translateX(0);transition: transform 2s ease;
} */.why-appear, .why-enter {opacity: 0;
}.why-appear-active, .why-enter-active {opacity: 1;transition: opacity 2s ease;
}/* 离开动画 */
.why-exit {opacity: 1;
}.why-exit-active {opacity: 0;transition: opacity 2s ease;
}
SwitchTransition
1.核心属性:mode
- in-out:表示新组件先进入,旧组件再移除;
- out-in:表示就组件先移除,新组建再进入;
2.子组件必须是 CSSTransition 或 Transition
3.通过 key 属性来区分不同的子组件
App.jsx
import React, { PureComponent } from 'react'
import { SwitchTransition, CSSTransition } from 'react-transition-group'
import "./style.css"export class App extends PureComponent {constructor() {super() this.state = {isLogin: true}}render() {const { isLogin } = this.statereturn (<div><SwitchTransition mode='out-in'><CSSTransitionkey={isLogin ? "exit": "login"}classNames="login"timeout={1000}><button onClick={e => this.setState({ isLogin: !isLogin })}>{ isLogin ? "退出": "登录" }</button></CSSTransition></SwitchTransition></div>)}
}export default App
style.css
.login-enter {transform: translateX(100px);opacity: 0;
}.login-enter-active {transform: translateX(0);opacity: 1;transition: all 1s ease;
}.login-exit {transform: translateX(0);opacity: 1;
}.login-exit-active {transform: translateX(-100px);opacity: 0;transition: all 1s ease;
}
TransitionGroup
可同时管理多个 Transition 或 CSSTransition 组件
App.jsx
import React, { PureComponent } from 'react'
import { TransitionGroup, CSSTransition } from "react-transition-group"
import "./style.css"export class App extends PureComponent {constructor() {super()this.state = {books: [{ id: 111, name: "你不知道JS", price: 99 },{ id: 222, name: "JS高级程序设计", price: 88 },{ id: 333, name: "Vuejs高级设计", price: 77 },]}}addNewBook() {const books = [...this.state.books]books.push({ id: new Date().getTime(), name: "React高级程序设计", price: 99 })this.setState({ books })}removeBook(index) {const books = [...this.state.books]books.splice(index, 1)this.setState({ books })}render() {const { books } = this.statereturn (<div><h2>书籍列表:</h2><TransitionGroup component="ul">{books.map((item, index) => {return (<CSSTransition key={item.id} classNames="book" timeout={1000}><li><span>{item.name}-{item.price}</span><button onClick={e => this.removeBook(index)}>删除</button></li></CSSTransition>)})}</TransitionGroup><button onClick={e => this.addNewBook()}>添加新书籍</button></div>)}
}export default App
style.css
.book-enter {transform: translateX(150px);opacity: 0;
}.book-enter-active {transform: translateX(0);opacity: 1;transition: all 1s ease;
}.book-exit {transform: translateX(0);opacity: 1;
}.book-exit-active {transform: translateX(150px);opacity: 0;transition: all 1s ease;
}
React编写CSS方式
内联样式style
写在行内,传入一个小驼峰命名的js对象,并且可以设置动态的样式
import React, { PureComponent } from 'react'export class App extends PureComponent {constructor() {super()this.state = {titleSize: 30}}addTitleSize() {this.setState({ titleSize: this.state.titleSize + 2 })}render() {const { titleSize } = this.statereturn (<div><button onClick={e => this.addTitleSize()}>增加titleSize</button><h2 style={{color: "red", fontSize: `${titleSize}px`}}>我是标题</h2><p style={{color: "blue", fontSize: "20px"}}>我是内容, 哈哈哈</p></div>)}
}export default App
CSS Module
将CSS样式封装到组件中,为每个组件生成唯一的类名,确保样式作用域仅限于当前组件,从而避免样式冲突
步骤一:创建一个名为 App.module.css 的文件
.title {font-size: 32px;color: green;
}.content {font-size: 22px;color: orange;
}
步骤二:通过 import 导入 CSS Module 文件,并使用生成的类名
import React, { PureComponent } from 'react'
import Home from './home/Home'
import Profile from './profile/Profile'import appStyle from "./App.module.css"export class App extends PureComponent {render() {return (<div><h2 className={appStyle.title}>我是标题</h2><p className={appStyle.content}>我是内容, 哈哈哈哈</p><Home/><Profile/></div>)}
}export default App
工作原理:CSS Modules 在构建过程中会自动为每个类名生成一个唯一的哈希值
Less编写
1. 安装 Less 和相关依赖
npm install less less-loader --save-dev
2.配置 Webpack 支持 Less
对于 Create React App 项目
由于 Create React App 默认隐藏了 Webpack 配置,可以通过 craco(Create React App Configuration Override)来修改配置:
step1:安装 craco 和 craco-less:
npm install @craco/craco craco-less --save-dev
step2:创建 craco.config.js 文件,并配置 Less:
const CracoLessPlugin = require('craco-less');module.exports = {plugins: [{plugin: CracoLessPlugin,options: {lessLoaderOptions: {lessOptions: {modifyVars: { '@primary-color': '#1e80ff' },javascriptEnabled: true,},},},},],
};
step3:修改 package.json 中的脚本命令,将 react-scripts 替换为 craco:
"scripts": {"start": "craco start","build": "craco build","test": "craco test","eject": "react-scripts eject"
}
3.使用 Less 编写样式
step1:定义全局变量
@primaryColor: red;.section {border: 1px solid @primaryColor;.title {font-size: 30px;color: @primaryColor;}.content {font-size: 20px;color: @primaryColor;}
}
step2:在组件中使用 Less
import React, { PureComponent } from 'react'
import "./App.less"export class App extends PureComponent {render() {return (<div className='app'><div className='section'><h2 className='title'>我是标题</h2><p className='content'>我是内容, 哈哈哈</p></div></div>)}
}export default App
CSS in JS
React思想中认为逻辑本身和UI是无法分离的,所有才有了JSX语法;样式也是UI的一部分,CSS-in-JS就是将样式写入到JS或TS中的方式
1.工作原理:
- 将样式定义在 JavaScript 中,并通过动态生成的类名或内联样式直接应用于组件
- 这种方式使得样式的作用域完全限定在组件内部,避免了全局样式冲突
2.基本使用
step1:安装styled-components:使用模板字符串定义样式
npm i styled-components
step2:定义一个style.js文件
import styled from "styled-components"export const AppWrapper = styled.div`border: 1px solid orange;
`
step3:导入组件中
import React, { PureComponent } from 'react'
import { AppWrapper} from "./style"export class App extends PureComponent {render() {return (<AppWrapper><h2 className='title'>我是标题</h2><p className='content'>我是内容, 哈哈哈</p></AppWrapper>)}
}export default App
3.props接收数据
获取props需要通过${}传入一个插值函数,props会作为该函数的参数

4.attrs属性
用于传递一组额外的属性到组件中,通常与props一起使用
当传过来的有值时使用传过来的,没值时设置一个默认样式
export const SectionWrapper = styled.div.attrs(props => ({tColor: props.color || "blue"
}))`border: 1px solid red;.title {font-size: ${props => props.size}px;color: ${props => props.tColor};&:hover {background-color: purple;}}}
`
5.styled高级特性
支持样式继承
import styled from "styled-components";const HYButton = styled.button`border: 1px solid red;border-radius: 5px;
`export const HYButtonWrapper = styled(HYButton)`background-color: #0f0;color: #fff;
`
styled设置主题
可用来设置和管理主题样式

classnames库
我们在react中可借用一个第三方库classnames来动态添加某些类
step1:安装
npm install classnames
step2:使用
import React, { PureComponent } from 'react'
import classNames from 'classnames'export class App extends PureComponent {constructor() {super()this.state = {isbbb: true,isccc: true}}render() {const { isbbb, isccc } = this.stateconst classList = ["aaa"]if (isbbb) classList.push("bbb")if (isccc) classList.push("ccc")const classname = classList.join(" ")return (<div><h2 className={`aaa ${isbbb ? 'bbb': ''} ${isccc ? 'ccc': ''}`}>哈哈哈</h2><h2 className={classname}>呵呵呵</h2><h2 className={classNames("aaa", { bbb:isbbb, ccc:isccc })}>嘿嘿嘿</h2><h2 className={classNames(["aaa", { bbb: isbbb, ccc: isccc }])}>嘻嘻嘻</h2></div>)}
}export default App相关文章:
React(六)React过渡动画-CSS编写方式
React过渡动画 react-transition-group介绍 在开发中,我们想要给一个组件的显示和消失添加某种过渡动画,提高用户体验→可通过react-transition-group实现。React曾为开发者提供过动画插件 react-addons-css-transition-group,后由社区维护…...
第十五章:Python的Pandas库详解及常见用法
在数据分析领域,Python的Pandas库是一个不可或缺的工具。它提供了高效的数据结构和数据分析工具,使得数据处理变得简单而直观。本文将详细介绍Pandas库的基本功能、常见用法,并通过示例代码演示如何使用Pandas进行数据处理。最后,…...
Python自动化模块:开启高效编程新时代
一、写在前面 在数字化时代,自动化技术已成为提高效率、降低成本的关键手段。Python 作为一种简洁、高效且功能强大的编程语言,凭借其丰富的库和框架,在自动化领域占据了举足轻重的地位,成为众多开发者的首选工具之一。从简单的文…...
【蓝桥杯速成】| 15.完全背包
题目:携带研究材料 问题描述 52. 携带研究材料(第七期模拟笔试) 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研…...
C++:allocator类(动态数组续)
1.为什么需要 allocator? 在 C 中,动态内存管理通常通过 new 和 delete 完成: int* p new int; // 分配内存 构造对象 delete p; // 析构对象 释放内存 但 new 和 delete 有两个问题: 耦合性:将内…...
libva基础
Libva(Lib Video Acceleration)是一个开源的库,实现了 **VA-API**(Video Acceleration API),旨在为视频处理提供跨平台的硬件加速支持。 1、核心功能与作用 硬件加速抽象层:Libva 作为中间层&…...
【C++20】format格式化输出
C20 format格式化输出 在C20之前,格式化能力都依赖于三方格式化库FMT, 而C20 标准委员会终于在C标准库引入了格式化功能,从使用方式和风格来看其实就是FMT库转正了 直接使用 包含<format.h>头文件既可以直接使用,类似pyt…...
c++游戏开发第一期
以后我将要发c游戏开发的教程,可能更得比较慢。(目测几个星期一更)。 今天先讲个配置编译器。 我用的是Visual studio 2022和EasyX。 安装studio: 首先找到下载链接(点我)下拉找到下面图片的东西。 下完…...
Elasticsearch:人工智能时代的公共部门数据治理
作者:来自 Elastic Darren Meiss 人工智能(AI)和生成式人工智能(GenAI)正在迅速改变公共部门,从理论探讨走向实际应用。正确的数据准备、管理和治理将在 GenAI 的成功实施中发挥关键作用。 我们最近举办了…...
Web开发:数据的加密和解密
一、常见通用术语解析 加盐:在密码中加入随机数据,提高安全性。摘要:固定长度的输出,用于数据完整性验证。加密:将数据转换为不可读形式,确保安全。撞库:通过暴力破解比对常见密码的攻击方式。…...
低功耗LPWAN模块开发指南:远距离无线通信与边缘计算融合实战
在远程资产追踪、野外环境监测等场景中,稳定可靠的长距离通信与超低功耗是系统设计的核心挑战。eFish-SBC-RK3576通过 原生双UART接口 USB OTG扩展能力 ,可无缝集成主流LPWAN模组(LoRa/NB-IoT),实现“数据采集-边…...
RHCA核心课程技术解析5:红帽高可用性集群架构与深度实践
一、红帽高可用集群架构全景 1.1 核心组件交互逻辑 graph TD A[节点1] -->|Corosync 心跳| B[节点2] A -->|Pacemaker 资源管理| C[共享存储] B --> C D[Fencing设备] -->|STONITH| A D -->|STONITH| B C -->|GFS2锁管理| A C -->|GFS2锁管理| B 1.2 集…...
Python切片中的步长秘密
Python切片中的步长秘密 大家好!今天我们来聊聊Python切片中一个有趣的话题 - 步长(step)。 基本格式回顾 Python切片的完整格式是: [起点:终点:步长] 但你是否注意到,很多代码里的切片都只写了起点和终点?没错,步长是可以省略的! 步长的默认…...
Spring Boot事务管理详解(附银行转账案例)
一、事务基础概念 事务的ACID特性: 原子性(Atomicity):操作要么全部成功,要么全部失败一致性(Consistency):数据在事务前后保持合法状态隔离性(Isolation)&…...
【超详细教程】2025年3月最新Pytorch安装教程(同时讲解安装CPU和GPU版本)
目录 一、前言二、pytorch简介三、安装准备工作3.1、下载Anaconda 四、判断是否有NVIDIA显卡五、安装pytorch-CPU版本六、安装pytorch-GPU版本6.1、查看CUDA显卡驱动版本6.2、安装CUDA6.3、安装CuDNN(加速器)6.4、安装pytorch-GPU6.5 其他方法安装注意 七…...
Unity光线传播体积(LPV)技术实现详解
一、LPV技术概述 光线传播体积(Light Propagation Volumes)是一种实时全局光照技术,通过将场景中的间接光信息存储在3D网格中,实现动态物体的间接光照效果。 核心优势: 实时性能:相比传统光照贴图,支持动态场景 硬件…...
Git和GitCode使用(从Git安装到上传项目一条龙)
第一步 菜鸟教程-Git教程 点击上方链接,完成Git的安装,并了解Git 工作流程,知道Git 工作区、暂存区和版本库的区别 第二步 GitCode官方帮助文档-SSH 公钥管理 点击上方链接,完成SSH公钥设置 第三步(GitCode的官方引…...
通信之光纤耦合器
以下是关于光纤耦合器的详细介绍: 定义与原理 - 定义:光纤耦合器是一种能使传输中的光信号在特殊结构的耦合区发生耦合,并进行再分配的器件,也叫分歧器、连接器、适配器、光纤法兰盘。 - 原理:利用不同光纤面紧邻光纤芯…...
5G核心网(5GC)开户中,DNN(Data Network Name,数据网络名称)
在5G核心网(5GC)开户中,DNN(Data Network Name,数据网络名称)是关键概念之一,以下是关于它的详细介绍: 定义 DNN是5G网络中用于标识外部数据网络的名称,相当于4G中的APN(Access Point Name),两者功能等价。 组成 DNN由两部分组成: 网络ID(NI):必选,至少包…...
OpenCV、YOLO与大模型的区别与关系
OpenCV、YOLO 和大模型的区别与关系 1. OpenCV(Open Source Computer Vision Library) 定位:开源的计算机视觉基础库。功能:提供传统的图像处理算法(如图像滤波、边缘检测、特征提取)和基础工具ÿ…...
虚拟电商-话费充值业务(二)话费充值对接供应商模块开发
一、对接供应商模块开发 供应商对接模块chongba_recharge_supplier主要负责的就是调用外部的供应商系统进行充值下单,这种调用是一种基于HTTP协议的调用。 此外在供应商对接模块中主要是实现的业务逻辑有: 1:余额或押金不足情况下的失败轮…...
练习题:110
目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 函数定义: 计算值的总和: 测试函数: 运行思路 结束语 Python题目 题目 定义一个函数,接受一个字典作为参数,返回字…...
c#winform,倒鸭子字幕效果,typemonkey字幕效果,抖音瀑布流字幕效果
不废话 直接上效果图 C# winform 开发抖音的瀑布流字幕。 也是typemonkey插件字幕效果 或者咱再网上常说的倒鸭子字幕效果 主要功能 1,软件可以自定义添加字幕内容 2,软件可以添加字幕显示的时间区间 3,可以自定义字幕颜色,可以随…...
游戏被外挂攻破?金融数据遭篡改?AI反作弊系统实战方案(代码+详细步骤)
一、背景与需求分析 随着游戏行业与金融领域的数字化进程加速,作弊行为(如游戏外挂、金融数据篡改)日益复杂化。传统基于规则的防御手段已难以应对新型攻击,而AI技术通过动态行为分析、异常检测等能力,为安全领域提供了革命性解决方案。本文以游戏反作弊系统和金融数据安…...
晶晨S905L3A(B)-安卓9.0-开启ADB和ROOT-支持IPTV6-支持外置游戏系统-支持多种无线芯片-支持救砖-完美通刷线刷固件包
晶晨S905L3A(B)-安卓9.0-开启ADB和ROOT-支持IPTV6-支持外置游戏系统-支持多种无线芯片-支持救砖-完美通刷线刷固件包 适用型号:M401A、CM311-1a、CM311-1sa、B863AV3.1-M2、B863AV3.2-M、UNT403A、UNT413A、M411A、E900V22C、E900V22D、IP112H等等晶晨S905L3A(B)处…...
AI来了,新手如何着手学习软件开发?
AI时代新手学习软件开发的7步进化指南 (附具体工具与避坑策略) 一、建立“人机协作”学习观 AI是教练,不是替身 正确姿势:用AI辅助理解概念(如让DeepSeek 、ChatGPT用生活案例解释递归),但坚持手…...
JDK 24 Class File API 介绍
概述 JDK 24 引入的 Class File API 提供了一套类型安全的 API 用于操作 Java 类文件。这套 API 允许我们以编程方式读取、修改和创建 Java 类文件,而不需要直接处理底层的字节码。 注1:JDK 24 已于2025年3月18日正式发布,Release信息参见官…...
C++23:现代C++的模块化革命与零成本抽象新高度
以下代码为伪代码,仅供参考 一、标准库的范式突破 1. std::expected:类型安全的错误处理 std::expected<DataPacket, ErrorCode> parsePacket(ByteStream& stream) {if (stream.header_valid()) return decode_packet(stream);elsereturn s…...
《K230 从熟悉到...》矩形检测
《K230 从熟悉到...》矩形检测 《庐山派 K230 从熟悉到...》矩形检测 矩形检测技术是一种广泛应用于电子图像处理的核心技术。它通过识别和分析图像中的矩形结构,为各种应用提供基础支持。从传统图像处理算法到现代深度学习技术,矩形检测的实现途径多种多…...
Unity 面向对象实战:掌握组件化设计与脚本通信,构建玩家敌人交互
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
