You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将clsx条件类转换为cva?附代码示例求助

问题

我正尝试将以下clsx代码转换为cva:

{items.map((item, index) => {
          const isActive = item.key === SOMETHING;
          return (
            <div
              key={index}
              className={clsx(
                `cursor-pointer`,
                {
                  "text-white": isActive && variant === "inverted",
                  "text-stone-950": isActive && variant === "default",
                  "text-[#9b9b9b]": !isActive,
                  "hover:text-white": variant === "inverted",
                  "hover:text-stone-950": variant === "default",
                },
              )}
            >...</div>
    });

我目前尝试的写法如下:

const textContentCva = cva("", {
    variants: {
      variant: {
        inverted: "hover:text-white",
        default: "hover:text-stone-950",
      },
    },
  });

但不确定如何传入isActive变量,我可以创建activeInverted、activeDefault变体,但这种方式并不理想,请问该如何正确转换为cva写法?

解决方案

你可以给cva新增一个active变体,结合原有的variant变体处理状态组合,避免冗余的变体类型:

const textContentCva = cva("cursor-pointer", {
  variants: {
    variant: {
      inverted: "hover:text-white",
      default: "hover:text-stone-950"
    },
    active: {
      true: {
        inverted: "text-white",
        default: "text-stone-950"
      },
      false: "text-[#9b9b9b]"
    }
  }
});

在组件中调用时,直接传入两个变体参数即可:

{items.map((item, index) => {
  const isActive = item.key === SOMETHING;
  return (
    <div
      key={index}
      className={textContentCva({ variant, active: isActive })}
    >...</div>
  );
})}

补充说明

  • 把cursor-pointer作为cva的基础类,无需单独拼接
  • active变体的true分支支持基于variant的值返回对应样式,这是cva的变体嵌套写法
  • 如果觉得嵌套写法不够直观,也可以用compoundVariants明确定义组合规则,效果一致:
const textContentCva = cva("cursor-pointer", {
  variants: {
    variant: {
      inverted: "hover:text-white",
      default: "hover:text-stone-950"
    },
    active: {
      true: "",
      false: "text-[#9b9b9b]"
    }
  },
  compoundVariants: [
    { variant: "inverted", active: true, className: "text-white" },
    { variant: "default", active: true, className: "text-stone-950" }
  ]
});

内容的提问来源于stack exchange,提问作者ajayv

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:29:53