Skip to main content

class

有两种方式为元素设置类:元素的 class 属性,以及 class: 指令。

属性

原始值被当作任何其他属性来处理:

<div class={large ? 'large' : 'small'}>...</div>

[!注意] 由于历史原因,假值(如falseNaN)会被转换为字符串(class="false"),尽管class={undefined}(或null)会导致属性完全省略。在 Svelte 的下一个版本中,所有假值都将导致class属性被省略。

对象和数组

自 Svelte 5.16 起,class可以是对象或数组,并使用clsx转换为字符串。

如果值是对象,则添加真值键:

<script>
	let { cool } = $props();
</script>

<!-- results in `class="cool"` if `cool` is truthy,
	 `class="lame"` otherwise -->
<div class={{ cool, lame: !cool }}>...</div>

如果值是数组,则将真值合并:

<!-- if `faded` and `large` are both truthy, results in
	 `class="saturate-0 opacity-50 scale-200"` -->
<div class={[faded && 'saturate-0 opacity-50', large && 'scale-200']}>...</div>

请注意,无论是使用数组还是对象形式,我们都可以使用单个条件同时设置多个类,这在使用 Tailwind 等工具时尤其有用。

数组可以包含数组和对象,clsx 将它们扁平化。这对于将本地类与 props 结合很有用,例如:

Button
<script>
	let props = $props();
</script>

<button {...props} class={['cool-button', props.class]}>
	{@render props.children?.()}
</button>
<script lang="ts">
	let props = $props();
</script>

<button {...props} class={['cool-button', props.class]}>
	{@render props.children?.()}
</button>

该组件的用户可以使用对象、数组和字符串的混合:

App
<script>
	import Button from './Button.svelte';
	let useTailwind = $state(false);
</script>

<Button
	onclick={() => useTailwind = true}
	class={{ 'bg-blue-700 sm:w-1/2': useTailwind }}
>
	Accept the inevitability of Tailwind
</Button>
<script lang="ts">
	import Button from './Button.svelte';
	let useTailwind = $state(false);
</script>

<Button
	onclick={() => useTailwind = true}
	class={{ 'bg-blue-700 sm:w-1/2': useTailwind }}
>
	Accept the inevitability of Tailwind
</Button>

Svelte 还暴露了 ClassValue 类型,这是元素上 class 属性接受的类型。如果您想在组件属性中使用类型安全的类名,这将很有用:

<script lang="ts">
	import type { ClassValue } from 'svelte/elements';

	const props: { class: ClassValue } = $props();
</script>

<div class={['original', props.class]}>...</div>

The class: directive

在 Svelte 5.16 之前,class:指令是设置元素条件类最方便的方式。

<!-- These are equivalent -->
<div class={{ cool, lame: !cool }}>...</div>
<div class:cool={cool} class:lame={!cool}>...</div>

与其它指令一样,当类名与值相同时,我们可以使用缩写:

<div class:cool class:lame={!cool}>...</div>

[注意] 除非您正在使用较旧的 Svelte 版本,否则请考虑避免使用class:,因为该属性更强大且可组合。

Edit this page on GitHub llms.txt

previous next