如何使用 clsx 正确加入顺风 css 类?

Posted

技术标签:

【中文标题】如何使用 clsx 正确加入顺风 css 类?【英文标题】:How to properly join tailwind css classes using clsx? 【发布时间】:2021-11-22 04:15:09 【问题描述】:

我正在尝试加入顺风课程并使用clsx 将它们应用于按钮。默认应用一个类'rounded-none',另一个作为prop传入

const Button = (
  children, ...props
): JSX.Element => 

  return (
    <ADButton
      className=clsx('rounded-none', props.className)
      ...props
    >
      children
    </ADButton>
  );
;

假设我已将padding-top: 0px; 添加到按钮中,如下所示

<Button
  color="primary"
  className="pt-0"
>
  t('btn.add')
</Button>

加入的类名应该类似于'rounded-none pt-0'。如果没有传递 className prop,则只需应用“rounded-none”

现在遇到的问题是“rounded-none”仅适用于没有 className 属性的按钮。在带有 className 属性的按钮上,只有 className 属性被应用,但没有“rounded-none”。我该如何解决这个问题,以便将两个类加入并应用于按钮?

【问题讨论】:

【参考方案1】:

您遇到此问题是因为ADButton 的默认属性设置为className,而您传递给按钮组件的额外属性也设置为className。实际上,您使用新传递的 className 属性覆盖默认 className。如果有 2 个类似命名的 props,React 将选择稍后在发生冲突时声明的那个。

所以这个:

<ADButton
      className=clsx('rounded-none', 'pt-0')
// I am declared later so I win
      className='pt-0'
    >
      children
    </ADButton>

变成:

<ADButton
      className="pt-0"
    >
      children
    </ADButton>

这里有一个解决方案:

const Button = (
  children, ...props
) => 
  const  classNameDestructured = "", ...rest  = props;
  return (
    <ADButton
      className=clsx('rounded-none', classNameDestructured)
      ...rest
    >
      children
    </ADButton>
  );
;

您解构props 并为classNameDestructured 设置默认值。这允许您在没有额外道具的情况下声明Button

<Button>
  t('btn.add')
</Button>

然后将classNameDestructured 作为参数传递给clsx() 函数。然后将您的其他类加入并应用于按钮。

之所以有效,是因为 className 不再在 ADButton 中声明为道具两次,因此我们消除了 覆盖 冲突。

【讨论】:

以上是关于如何使用 clsx 正确加入顺风 css 类?的主要内容,如果未能解决你的问题,请参考以下文章

顺风 CSS 导航栏

如何使用顺风 css 进行页面转换并做出反应?

如何在顺风 css 中使用颜色或 css/scss 中的材质 ui

如何使用顺风使 CSS 网格项具有自动高度?

如何在 React 中使用 clsx

如何在顺风CSS中只制作占位符斜体?