Svelte:指定多个条件类属性

oae*_*oae 8 svelte tailwind-css svelte-3

我想让这样的事情成为可能:

<div 
   class="overflow-scroll h-screen antialiased ..."
   class:whiteTheme="bg-gray-100 text-gray-800 ..."
   class:darkTheme="bg-blue-900 ..."
>
...
</div>
Run Code Online (Sandbox Code Playgroud)

因此,将始终应用一组类。一组仅当whiteTheme为真时,另一组仅当darkTheme为真时。

我知道我可以定义一个whiteTheme和一个darkThemecss 类并让它像那样工作

<div 
   class="overflow-scroll h-screen antialiased ..."
   class:whiteTheme
   class:darkTheme
>
Run Code Online (Sandbox Code Playgroud)

但关键是我想单独设计每个元素(尤其是在我的应用程序的开始阶段)。并且必须为不同类中的每个元素定义我的一组类......对我来说,使用 Tailwind.css 和对特定元素进行试验的目的(无需在 css 定义和元素定义之间来回跳转)。

我可以选择的另一种方式是:

<div 
   class="overflow-scroll h-screen antialiased ... {whiteTheme?'bg-gray-100 text-gray-800 ...':'bg-blue-900 ...'}">
Run Code Online (Sandbox Code Playgroud)

这没什么,但我很想通过在单独的属性中定义事物来提高可读性和可维护性......

所以我想知道是否有办法让它按照我想要的方式工作......例如,我可以轻松扩展 Svelte 编译器吗?

最好的约翰内斯

Ste*_*aes 9

你很接近你的一个建议,但它与你想要的相反: class:something={condition}

这将在满足条件时应用something类。

所以在你的情况下,你必须做

class:bg-gray-100={whiteTheme}
class:text-gray-800={whiteTheme}
Run Code Online (Sandbox Code Playgroud)

作为替代方案,你可以做

<script>
 $: whiteThemeClasses = whiteTheme ? "gray text..." : "";
 ...
...class=" fixedclasses {whiteThemeClasses} {blackThemeClasses}
Run Code Online (Sandbox Code Playgroud)


JHe*_*eth 5

您可以将 light 和 dark 的类列表放入字符串变量中,并根据商店中变量 darkTheme 的真实性在具有三元组的变量之间切换,以便它在更改时更新所有组件。

它允许您单独为浅色和深色主题设置每个组件的样式,由于空格分隔的字符串类似于我们使用 css 看到的字符串,因此大大提高了可读性,并且您可以将类列表放在顶部每个组件以保持可见性/易于访问。

<script>
    let light = 'bg-gray-100 text-gray-800 shadow-xl';
    let dark = 'bg-blue-900 text-white';
    
    import { darkTheme } from './store.js';
</script>

<div class="overflow-scroll h-screen p-3 {$darkTheme? dark : light}" >
...
</div>
Run Code Online (Sandbox Code Playgroud)

编辑:

**这仅适用于 Tailwind 用户,不适用于您仍在尝试有条件地应用多个类的情况。

Tailwind 2 现在通过暗类为我们处理这个问题。

首先,您需要在文件中手动切换暗模式tailwind.config.js

然后您可以有条件地将深色类应用于单个顶级容器,并且嵌套在其中的所有组件都可以使用 dark:class-name 并且它将应用深色主题。无需传递状态或将带有暗变量的商店导入到每个组件中。

这是使用固定样式表的REPL,因为 Tailwind 2 CDN 不darkMode作为类提供。


oae*_*oae 5

好吧,经过更多的挖掘,我决定采用以下模式:

<div 
   class="overflow-scroll 
          h-screen 
          antialiased 
          ... 
          bg-gray-100 
          text-gray-800
          ...
          dark:bg-blue-900
          dark:text-yellow-200
          ..."
>
...
</div>
Run Code Online (Sandbox Code Playgroud)
  • 这对于所有“静态”样式来说都非常好。对于像元素这样的动态事物active/selected,我决定使用样式:
import { darkTheme } from '../stores.js';
...
<div
    class:selected
    class:$darkTheme
...
<style>
.selected {
    // all common styles
    @apply cursor-default;

    // all light styles
    @apply text-blue-600;
    @apply border-blue-600;
}

.selected.\$darkTheme {
    // all dark styles
    @apply text-yellow-700;
    @apply border-yellow-700;
}
</style>

Run Code Online (Sandbox Code Playgroud)

我认为使用样式对于较小的组件来说还不错。然而,我仍然会发现在 Svelte 中定义自定义任务的可能性很有趣......或者更改语法,例如class:true/false={my classes ...}

一些附加说明: