【CSS 】Class Variance Authority CSS 类名管理工具库
1.背景、什么是 CVA?
- Class Variance Authority (CVA) 是一个用于管理 CSS 类名 的工具库,特别适合在
React或Vue等前端框架中使用。 - 它可以帮助你更轻松地处理组件的 样式变体(Variants),比如按钮的不同状态(
primary、secondary、disabled等)。 - 它非常契合像
Tailwind CSS这类的原子化思想。
2.CVA的主要功能和特点?
- 结构化样式管理:CVA提供了一种结构化的方式来管理样式变体,减少了全局样式冲突的可能性。它允许开发者以声明的方式描述每个参数值的样式,从而自动找出正确的样式组合。
- 方便样式复用和扩展:当需要添加新的样式变体时,CVA使得扩展变得更加方便和高效。开发者可以通过定义variants、compoundVariants和defaultVariants等参数,来轻松创建可复用的样式组合。
- 减少样式冲突:由于CVA采用了结构化的样式管理方式,因此可以大大减少样式冲突的可能性。这使得在大型项目中维护样式变得更加容易。
3.CVA 的使用场景
CVA特别适用于使用Tailwind CSS等原子化 CSS 框架的项目。- 在这些项目中,开发者通常需要根据组件的 props 值将 Tailwind 类组合在一起,以创建可重用的 UI 元素。
- 然而,随着组件样式的增加,这种组合方式可能会变得非常复杂。通过引入 CVA,开发者可以消除这种复杂性,并以声明的方式描述每个参数值的样式。
4.如何在项目中使用 CVA
4.1安装
你可以通过 npm 或 pnpm 安装 CVA:
npm install class-variance-authority
或者
pnpm add class-variance-authority
4.2 CVA函数参数
- 基础类名(Base Classes)
- 参数形式:通常是一个数组(也可以是一个用空格分割的字符串),包含一组基础的
CSS类名。- [‘pl-2’, ‘pt-1’]
- ‘pl-2 pt-1’
- 作用:这些基础类名会被应用到所有生成的样式类名组合中,作为样式的基础部分。它们不是“默认值”意义上的参数,而是函数调用的必需部分。
- 参数形式:通常是一个数组(也可以是一个用空格分割的字符串),包含一组基础的
- 变体定义(
Variants Definitions)- 参数形式:一个对象,其键是变体属性的名称,值通常是一个对象,该对象定义了不同属性值对应的CSS类名数组。
- 作用:变体定义用于指定不同属性组合下的样式变化。这里的对象不是“第二个值”的固定形式,而是变体定义的一种常见结构。
- 其他可选参数
- 复合变体(
Compound Variants):一个对象,定义了当多个变体属性同时满足特定条件时应用的额外CSS类名。 - 默认变体(
Default Variants):一个数组或者是一个字符串,指定了当没有提供特定变体属性值时应使用的默认值。
- 复合变体(
4.3 定义CVA函数
4.3.1 基础使用
以下是一个简单的示例,展示如何使用 CVA 创建一个带有变体的按钮组件。
4.3.1.1 第一步
button.tsx
import React from "react";
import { cva } from "class-variance-authority";export type ButtonProps = {intent: "primary" | "secondary" | "danger";size: "small" | "medium" | "large";children: React.ReactNode;
}/** * 定义样式变体 buttonVariants* cva:核心函数,用于定义样式变体。* variants:定义组件的变体(如 intent 和 size)。* defaultVariants:设置默认的变体值。
*/
const buttonVariants = cva("button", {variants: {intent: {primary: "bg-blue-500 text-white",secondary: "bg-gray-500 text-white",danger: "bg-red-500 text-white",},size: {small: "text-sm py-1 px-2",medium: "text-base py-2 px-4",large: "text-lg py-3 px-6",},},defaultVariants: {intent: "primary",size: "medium",},
});/** * 按钮组件 * buttonVariants({ intent, size }):根据传入的 intent 和 size 动态生成类名。
*/
const Button = ({ intent, size, children }: ButtonProps) => {return (<button className={buttonVariants({ intent, size })}>{children}</button>);
};export default Button;
4.3.2.1.2 第二步 使用 botton 按钮
根据传入的 intent 和 size 动态生成类名。
import Button from './botton.tsx'function App() {return (<div>{/* button bg-blue-500 text-white text-base py-2 px-4 */}<Button intent="primary" size="medium">Primary Button</Button>{/* button bg-gray-500 text-white text-sm py-1 px-2500 */}<Button intent="secondary" size="small">Secondary Button</Button>{/* 样式为: button bg-red-500 text-white text-lg py-3 px-6 */}<Button intent="danger" size="large">Danger Button</Button></div>);
}export default App;
4.3.1.2 高级用法
4.3.1.2.1 第一步: 复合变体, 你可以定义多个变体的组合!
button.tsx
import React from "react";
import { cva } from "class-variance-authority";export type ButtonProps = {intent: "primary" | "secondary"disabled: booleanchildren: React.ReactNode
}/** * 定义样式变体 * cva 第一个参数:"button" 是基础类名,用于定义组件的默认样式(如果有多个用空格分即可)。* variants:定义组件的变体(如 intent 和 size)。* defaultVariants:设置默认的变体值。* compoundVariants:用于定义多个变体的组合样式。
*/const buttonVariants = cva("button", {variants: {intent: {primary: "bg-blue-500 text-white",secondary: "bg-gray-500 text-white",},outlined: {true: "border-2",},},compoundVariants: [{intent: "primary",outlined: false,class: "border-blue-500",},{intent: "secondary",outlined: false,class: "border-gray-500",},],
});/** * 按钮组件 * buttonVariants({ intent, disabled }):根据传入的 intent 和 size 动态生成类名。* 当 intent="secondary" 时,disabled=false 时, 它会添加 border-gray-500 类名到结果数组中;
*/const Button = ({ intent, disabled }: ButtonProps) => {return (<buttonclassName={buttonVariants({intent,outlined: disabled,})}>Click Me</button>);
};export default Button;
4.3.1.2.2 第二步
根据传入的 intent 和 disabled动态生成类名。
import Button from './botton.tsx'function App() {return (<div>{/* 当 intent="secondary" 时,disabled=true 时,样式为:button bg-blue-500 text-white border-2 */}<Button intent="primary" disabled>Primary Button</Button>{/* 当 intent="secondary" 时,disabled=false 时,样式为:button bg-gray-500 text-white border-gray-500 */}<Button intent="secondary"disabled={false}>Secondary Button</Button></div>);
}export default App;
5. 优点
- 声明式 API:通过
variants和defaultVariants定义样式,代码更清晰。 - 类型安全:如果你使用 TypeScript,CVA 可以提供完整的类型推断。
- 灵活性:支持复合变体和动态类名,适合复杂的 UI 组件。
6. 总结
- Class Variance Authority (CVA) 是一个强大的工具,特别适合管理组件的样式变体。
- 它可以帮助你减少重复代码,提高开发效率。
- 如果你正在构建一个需要多种样式变体的组件库,CVA 是一个非常好的选择!
- 如果你有更多问题,欢迎随时问我!😊
相关文章:
【CSS 】Class Variance Authority CSS 类名管理工具库
1.背景、什么是 CVA? Class Variance Authority (CVA) 是一个用于管理 CSS 类名 的工具库,特别适合在 React 或 Vue 等前端框架中使用。它可以帮助你更轻松地处理组件的 样式变体(Variants),比如按钮的不同状态&#…...
[Python入门学习记录(小甲鱼)]第5章 列表 元组 字符串
第5章 列表 元组 字符串 5.1 列表 一个类似数组的东西 5.1.1 创建列表 一个中括号[ ] 把数据包起来就是创建了 number [1,2,3,4,5] print(type(number)) #返回 list 类型 for each in number:print(each) #输出 1 2 3 4 5#列表里不要求都是一个数据类型 mix [213,"…...
《量子潮涌下,DataWorks中AI模型训练框架的变革征途》
在科技迅猛发展的当下,量子计算技术犹如一颗璀璨新星,正以惊人的速度改写着人类的计算格局。这一颠覆性的技术,为人工智能(AI)领域带来了前所未有的发展契机,尤其是在处理海量数据方面,展现出传…...
【够用就好006】如何从零开发游戏上架steam面向AI编程的godot独立游戏制作实录001流程
记录工作实践 这是全新的系列,一直有个游戏制作梦 感谢AI时代,让这一切变得可行 长欢迎共同见证,期更新,欢迎保持关注,待到游戏上架那一天,一起玩 面向AI编程的godot独立游戏制作流程实录001 本期是第…...
LNK2038 检测到“RuntimeLibrary”的不匹配项: 值“MT_StaticRelease”不匹配值“MD_DynamicRelease”
vs2019中属性设置 报错: vs2019中属性设置为 报错: 设置为 报错: 设置为 报错: 原因:是由于ncnn和paddleLite的库同时使用会冲突。只能用其中之一。 后面部署降lite都换成了ncnn就可以了。 要么都用ncnn&a…...
docker-compose部署mongodb副本集集群
生成密钥文件 openssl rand -base64 756 > mongodb.key chmod 400 mongodb.key # 权限必须为400:ml-citation{ref="4" data="citationList"} chown 999:999 mongodb.key # MongoDB容器用户ID为999:ml-citation{ref="4" data="…...
SpringBoot校园管理系统设计与实现
在现代校园管理中,一个高效、灵活的管理系统是不可或缺的。本文将详细介绍基于SpringBoot的校园管理系统的设计与实现,涵盖管理员、用户和院校管理员三大功能模块,以及系统的部署步骤和数据库配置。 管理员功能模块 管理员是系统的核心管理…...
[QT]开发全解析:从概念到实战
文章目录 Qt 框架入门与应用开发指南一、Qt 框架概述1.1 什么是 Qt1.2 Qt 的发展史1.3 Qt 支持的平台1.4 Qt 版本1.5 Qt 的优点1.6 Qt 的应用场景1.7 Qt 的成功案例 二、Qt 的开发工具概述Qt CreatorVisual StudioEclipse 三、认识 Qt Creator3.1 Qt Creator 概览3.2 使用 Qt C…...
【pyqt】(十二)文本框
控件-文本框 文本框主要有两类,为富文本框(QTextEdit)和纯文本框(QPlainTextEdit),在学习新的控件的时候, 需要掌握的内容主要除了属性之外,其信号触发方法也非常重要。还可以利用Designer来辅助我们进行学习,尤其是利…...
汽车免拆诊断案例 | 2023款丰田雷凌汽油版车行驶中偶尔出现通信故障
故障现象 一辆2023款丰田雷凌汽油版车,搭载1.5 L发动机,累计行驶里程约为4700 km。车主反映,行驶中偶尔组合仪表上的发动机转速信号丢失,转向变重,且有“闯车”感,同时车辆故障警报蜂鸣器鸣响。 故障诊断…...
关于OceanBase与CDH适配的经验分享
CDH是Cloudera早期推出的一个开源平台版本,它实质上成为了Apache Hadoop生态系统内公认的安装与管理平台,专为企业级需求量身打造。CDH为用户提供了即装即用的企业级解决方案。通过整合Hadoop与另外十多项关键开源项目,Cloudera构建了一个功能…...
基于国产芯片的AI引擎技术,打造更安全的算力生态 | 京东零售技术实践
近年来,随着国产AI芯片的日益崛起,基于国产AI芯片的模型适配、性能优化以及应用落地是国产AI应用的一道重要关卡。如何在复杂的京东零售业务场景下更好地使用国产AI芯片,并保障算力安全,是目前亟需解决的问题。对此,京…...
第五十四:渲染数据 v-text 和 v-html
v-text : 解析成文本 v-html: 解析成 html <div id"app"><h3>{{ web.title }}</h3><!-- v-text 将数据解析为纯文本格式 --><h3 v-text"web.title"></h3><!-- v-html 将数据解析为 html 格式 --><h3 v-htm…...
HTML label 标签使用
点击 <label> 标签通常会使与之关联的表单控件获得焦点或被激活。 通过正确使用 <label> 标签,可以使表单更加友好和易于使用,同时提高整体的可访问性。 基本用法 <label> 标签通过 for 属性与 id 为 username 的 <input> 元素…...
GB28181开发--ZLMediaKit+WVP+Jessibuca
一、核心组件功能 1、ZLMediaKit 定位:基于 C++11 的高性能流媒体服务框架,支持 RTSP/RTMP/HLS/HTTP-FLV 等协议互转,具备低延迟(最低 100ms)、高并发(单机 10W 级连接)特性,适用于商用级流媒体服务器部署。 特性:跨平台(Linux/Windows/ARM 等)、支持 …...
Linux和gcc/g++常用命令总结
目录 Linux命令总结 文件操作相关命令 ls cd pwd cp mv rm cat mkdir rmdir touch 文本处理操作命令 grep awk sed 进程管理操作相关命令 ps top htop kill pkill killall chmod chown 网络操作相关命令 ping ifconfig netstat ss lsof curl …...
Sqoop从入门到使用
安装和配置 修改文件配置:修改文件名将(sqoop-env-template.sh改为sqoop-env.sh) 编辑sqoop-env.sh内部文本,修改调用文件位置 将sqoop-env.sh,配置到全局变量中,方便调用。 查看正常运用 第一类࿱…...
2024华为OD机试真题-磁盘容量排序算法(C++)-E卷B卷-100分
2024华为OD机试题库-(E卷+C卷+D卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 用例1 用例2 考点 题目解析 代码 c++ 题目描述 磁盘的容量单位常用的有 M,G,T 这三个等级,它们之间的换算关系为: 1T = 1024G 1G = 1024M 现在给定 n 块磁盘的容量,…...
【数据结构】堆(挑战从零基础到进阶)
我们从概念开始一步步来学习堆,下面我们来从零基础来解剖该种数据结构。先提前透明:实现堆其实就是基于数组来实现一个完全二叉树而已 ! 目录 堆的概念 堆的性质 堆的物理逻辑&思维逻辑 堆的节点对应关系 堆的核心操作 (…...
阿里 DataWorks:数据治理、安全中心、数据质量核心功能梳理
文章目录 阿里 DataWorks:云原生数据治理与安全一体化实践指南一、数据治理中心1.1 数据治理体系1.2 产品架构全图1.3 概要使用路径1.4 治理现状评估数据治理健康分评估模型 1.5 检查项 & 治理项(1) 检查项(2) 治理项 1.6 治理工具箱1.7 治理结果查看 二、安全中…...
DeepSeek精品课分享 清北
AI淘金潮上热搜!有人已经靠DeepSeek日入过万了! 北大清华等高校也相继出品DeepSeek高质量精品课程,在网上传疯。帮助学者高效学习AI从入门到精通! 完整版资料已经帮大家整理好了,免费领! 资料链接: htt…...
获取当前页面的 url 参数
一、使用 URLSearchParams(现代浏览器支持) URLSearchParams 是 JavaScript 提供的一个内置对象,用于处理 URL 的查询字符串,它提供了一系列方便的方法来获取、设置和删除查询参数。 // 获取当前页面的 URL 参数 const queryStr…...
解锁健康密码,开启养生之旅
在这个生活节奏飞快、压力如影随形的时代,健康养生不再是一句空泛的口号,而是我们对高品质生活的热切追求。它就像一把神奇的钥匙,能够打开通往活力与幸福的大门。 日常习惯与养生息息相关。晨起后,空腹喝一杯温水,如…...
Mybatis集合嵌套查询,三级嵌套
三个表:房间 玩家 玩家信息 知识点:Mybatis中级联有关联(association)、集合(collection)、鉴别器(discriminator)三种。其中,association对应一对一关系、collectio…...
Python的Pandas和matplotlib库:让数据可视化贼简单
在数据爆炸的时代,数据可视化已成为数据分析的关键环节。Python 作为强大的编程语言,拥有众多用于数据可视化的库,而 pandas 库在其中扮演着重要角色。它不仅能高效处理和分析数据,还具备强大的数据可视化功能,让我们轻…...
数据结构基础之《(19)—矩阵处理》
一、zigzag打印矩阵 Z字形打印矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 打印顺序:1,2,7,13,8,3,4,9,14... 核心技巧:找到coding上的宏观调度 左上角有A、B两个点,A往右一步一步走,B往下一步一步走 写一个…...
IDEA与Maven使用-学习记录(持续补充...)
1. 下载与安装 以ideaIU-2021.3.1为例,安装步骤: 以管理员身份启动ideaIU-2021.3.1修改安装路径为:D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】(可选)、【打开文件夹作为项目】&…...
【运维笔记】docker 中 MySQL从5.7版本升级到8.0版本 - 平滑升级
在Docker环境中,将MySQL从5.7版本升级到8.0版本时,数据确实需要迁移。虽然不能直接通过docker-compose命令简单地进行版本升级并保留所有数据,但可以通过一系列步骤来实现平滑升级和数据迁移。以下是详细的迁移步骤: 一、准备阶段…...
nuxt2 打包优化使用“compression-webpack-plugin”插件
在使用 Nuxt.js 构建项目时,为了提高性能,通常会考虑对静态资源进行压缩。compression-webpack-plugin 是一个常用的 Webpack 插件,用于在生产环境中对文件进行 Gzip 压缩。这对于减少网络传输时间和提高页面加载速度非常有帮助。下面是如何在…...
fastapi+mysql实现增删改查
说明: 我计划用python的fastapi框架,实现操作MySQL数据库的表,实现增删改查的操作,并且在postman里面测试 step1: 安装数据库依赖 pip install fastapi uvicorn pymysqlstep2:C:\Users\Administrator\PycharmProjects\FastAPIPro…...
