Twig

灵活、快速且安全的
PHP 模板引擎

a Symfony Product
文档 函数 html_cva
您正在阅读 Twig 3.x 的文档。切换到 Twig 1.x, 2.x 的文档。

问题与反馈

许可证

Twig 文档 基于新 BSD 许可证 授权。

html_cva

3.12

html_cva 函数在 Twig 3.12 中添加。

CVA (Class Variant Authority) 是来自 JavaScript 世界的概念,并被著名的 shadcn/ui 库使用。 CVA 概念用于渲染组件的多种变体,应用一组条件和配方来动态组合 CSS 类字符串(颜色、尺寸等),以创建高度可重用和可定制的模板。

CVA 的概念由 html_cva() Twig 函数驱动,您可以在其中定义应始终存在的 base 类,然后定义不同的 variants 和相应的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{# templates/alert.html.twig #}
{% set alert = html_cva(
    base: 'alert',
    variants: {
        color: {
            blue: 'bg-blue',
            red: 'bg-red',
            green: 'bg-green',
        },
        size: {
            sm: 'text-sm',
            md: 'text-md',
            lg: 'text-lg',
        }
    }
) %}

<div class="{{ alert.apply({color, size}, class) }}">
    ...
</div>

然后使用 colorsize 变体来选择所需的类

1
2
3
4
5
6
7
8
9
{# index.html.twig #}
{{ include('alert.html.twig', {'color': 'blue', 'size': 'md'}) }}
// class="alert bg-blue text-md"

{{ include('alert.html.twig', {'color': 'green', 'size': 'sm'}) }}
// class="alert bg-green text-sm"

{{ include('alert.html.twig', {'color': 'red', 'class': 'flex items-center justify-center'}) }}
// class="alert bg-red flex items-center justify-center"

CVA 和 Tailwind CSS

CVA 与 Tailwind CSS 完美配合。 唯一的缺点是您可能会遇到类冲突。 要“合并”冲突的类并仅保留您需要的类,请将 tailwind_merge() 过滤器与来自 tales-from-a-dev/twig-tailwind-extrahtml_cva() 函数一起使用

1
$ composer require tales-from-a-dev/twig-tailwind-extra
1
2
3
4
5
6
7
{% set alert = html_cva(
   // ...
) %}

<div class="{{ alert.apply({color, size}, class)|tailwind_merge }}">
     ...
</div>

复合变体

您可以定义复合变体。 复合变体是在满足多个其他变体条件时应用的变体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{% set alert = html_cva(
    base: 'alert',
    variants: {
        color: {
            blue: 'bg-blue',
            red: 'bg-red',
            green: 'bg-green',
        },
        size: {
            sm: 'text-sm',
            md: 'text-md',
            lg: 'text-lg',
        }
    },
    compoundVariants: [{
        // if color = red AND size = (md or lg), add the `font-bold` class
        color: ['red'],
        size: ['md', 'lg'],
        class: 'font-bold'
    }]
) %}

<div class="{{ alert.apply({color, size}) }}">
     ...
</div>

{# index.html.twig #}

{{ include('alert.html.twig', {color: 'red', size: 'lg'}) }}
// class="alert bg-red text-lg font-bold"

{{ include('alert.html.twig', {color: 'green', size: 'sm'}) }}
// class="alert bg-green text-sm"

{{ include('alert.html.twig', {color: 'red', size: 'md'}) }}
// class="alert bg-green text-md font-bold"

默认变体

如果没有任何变体匹配,您可以定义一组默认类来应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{% set alert = html_cva(
    base: 'alert',
    variants: {
        color: {
            blue: 'bg-blue',
            red: 'bg-red',
            green: 'bg-green',
        },
        size: {
            sm: 'text-sm',
            md: 'text-md',
            lg: 'text-lg',
        },
        rounded: {
            sm: 'rounded-sm',
            md: 'rounded-md',
            lg: 'rounded-lg',
        }
    },
    defaultVariant: {
        rounded: 'md',
    }
) %}

<div class="{{ alert.apply({color, size}) }}">
     ...
</div>

{# index.html.twig #}

{{ include('alert.html.twig', {color: 'red', size: 'lg'}) }}
// class="alert bg-red text-lg rounded-md"

注意

html_cva 函数是默认未安装的 HtmlExtension 的一部分。 请先安装它

1
$ composer require twig/html-extra

然后,在 Symfony 项目上,安装 twig/extra-bundle

1
$ composer require twig/extra-bundle

否则,在 Twig 环境中显式添加扩展

1
2
3
4
use Twig\Extra\Html\HtmlExtension;

$twig = new \Twig\Environment(...);
$twig->addExtension(new HtmlExtension());

此函数与 TwigComponent 一起使用时效果最佳。