在 svelte 中添加动态 class 名称

adding dynamic class name in svelte

我目前正在使用 svelte、sapper 和 tailwind 编写应用程序。所以为了让顺风工作,我已经将它添加到我的汇总配置中

svelte({
        compilerOptions: {
          dev,
          hydratable: true,
        },
        preprocess: sveltePreprocess({
          sourceMap: dev,
          postcss: {
            plugins: [
              require("tailwindcss"),
              require("autoprefixer"),
              require("postcss-nesting"),
            ],
          },
        }),
        emitCss: true,
      })

所有这些都有效,但我遇到了一些动态 class 名称的问题。

写这样的东西似乎总能奏效

  <div class={true ? 'class-a' : 'class-b'}>

class-aclass-b 都将包含在最终发出的 CSS 中,一切都按预期进行。

但是当我尝试添加变量 class 名称时,它不起作用。想象一下:

  <div class={`col-span-6`}>

它会完全按照预期工作,并且会从 tailwind 中的 css class col-span-6 获得正确的样式。

但是如果我把它改成这样:

  <div class={`col-span-`}>

那么该样式将不会被包含。 另一方面,如果我已经有一个带有 class col-span-6 的 DOM 元素,那么样式将被添加到两个元素中。

所以我的猜测是编译器发现 css 没有被使用,它被删除了。 我想我的问题是,是否有任何方法可以从顺风中强制采用所有样式?这样我就可以使用更动态的 class 名称

不确定它是否相关,但我一直在测试它的组件有这个样式块

<style>
  @tailwind base;
  @tailwind components;
  @tailwind utilities;
</style>

编辑: 可以补充一点,我在日志中得到一堆打印件,说有未使用的 css 选择器似乎匹配所有顺风 classes

我认为是 purgeCSS(内置于 tailwind 2.0)无法识别动态 类。

很难解决每个顺风问题 类,但如果你没有很多顺风,你可以 manually safe list those classnames:

// tailwind.config.js
module.exports = {
  purge: {
    content: ['./src/**/*.html'],

    // These options are passed through directly to PurgeCSS
    options: {
      // Generate col-span-1 -> 12
      safelist: [...Array.from({ length: 12. }).fill('').map((_, i) => `col-span-${i + 1}`],
    },
  },
  // ...
}

我认为当 class 属性是一个变量或依赖于一个变量时,它不会在编译期间用于提取样式(class- 不是在编译期间评估而是在运行时评估),因为svelte 将其标记为未使用的 css 选择器,因为编译代码时不知道 class 属性的值。

要强制 svelte 包含您的样式,您必须将其标记为全局样式,为此我们有两个选择:

<script>
// component logic goes here
</script>
div class={`class-`}/>

选项 1:

<style>
 :global(.class-6){
 // style goes here
 }
</style>

选项 2:这会将您的所有样式标记为全局样式

<style global>
 .class-6{
 // style goes here
 }
</style>

我遇到了同样的问题,<div class="pl-{indent*4}">在 svelte 中不工作。

我的解决方案是使用内联样式,

<div style="padding-left:{indent}rem">,

这是从pl-1=padding-left: 0.25rem; /* 4px */推断出来的。

我觉得比较简单 class.