cva(class-variance-authority)函数介绍

半兽人 发表于: 2025-03-31   最后更新时间: 2025-03-31 10:54:46  
{{totalSubscript}} 订阅, 26 游览

cvaclass-variance-authority(简称 CVA)库中的一个函数,它用于创建可变的(可配置的)CSS 类管理器。它的作用是根据不同的 变体(variants)条件(conditions) 生成相应的 CSS 类,以减少手写 className 的冗余,并提供更好的可维护性。


cva 的基本使用

import { cva } from "class-variance-authority";

const button = cva(
  "px-4 py-2 font-bold rounded",  // 基础样式
  {
    variants: {
      variant: {
        primary: "bg-blue-500 text-white",
        secondary: "bg-gray-500 text-white",
      },
      size: {
        sm: "text-sm",
        lg: "text-lg",
      },
    },
    defaultVariants: {
      variant: "primary",
      size: "sm",
    },
  }
);

console.log(button()); 
// "px-4 py-2 font-bold rounded bg-blue-500 text-white text-sm" (默认)

console.log(button({ variant: "secondary", size: "lg" })); 
// "px-4 py-2 font-bold rounded bg-gray-500 text-white text-lg"

结合 React 组件

import { cva, type VariantProps } from "class-variance-authority";

const button = cva(
  "px-4 py-2 font-bold rounded",
  {
    variants: {
      variant: {
        primary: "bg-blue-500 text-white",
        secondary: "bg-gray-500 text-white",
      },
      size: {
        sm: "text-sm",
        lg: "text-lg",
      },
    },
    defaultVariants: {
      variant: "primary",
      size: "sm",
    },
  }
);

// 获取类型
type ButtonProps = VariantProps<typeof button> & React.ButtonHTMLAttributes<HTMLButtonElement>;

const Button: React.FC<ButtonProps> = ({ variant, size, className, ...props }) => {
  return <button className={button({ variant, size, className })} {...props} />;
};

// 使用
export default function App() {
  return (
    <div className="flex gap-4">
      <Button variant="primary" size="sm">Primary Small</Button>
      <Button variant="secondary" size="lg">Secondary Large</Button>
    </div>
  );
}

cva 的作用总结

  1. 管理 CSS 变体(variants):避免手写 className 组合。
  2. 提供默认值(defaultVariants):避免每次都必须指定所有的变体。
  3. 可以动态组合(动态拼接 className):支持动态传入 className 进行扩展。
  4. 支持 TypeScript 类型推导:配合 VariantProps 自动推导变体的类型。

适用于 Tailwind CSS 项目,让 className 变得更简洁、可维护!

更新于 2025-03-31
在线,2小时前登录

查看React更多相关的文章或提一个关于React的问题,也可以与我们一起分享文章