(Svelte) Utilizing Class Properties

Nov 28, 2023

When developing components with Svelte, there are often situations where you need to pass HTML Element’s class attributes to other components. However, a straightforward approach can lead to issues.

<script>
  export let class = "";
  // 🚨 Parsing error: 'class' is not allowed as a variable declaration name. eslint
  // 🚨 Variable declaration not allowed at this location. ts(1440)
</script>

The error occurs because class is a JavaScript declaration command used to create class objects. It’s not meant to be used as a variable! This is similar to why React uses className instead of class.

Using className as below can lead to inconsistency and mistakes when using components:

<script>
  export let className = "";
</script>
 
<Button className=""></Button>
<!-- I have to use className for my components..? -->
<button class=""></button>

To solve this, a bit of know-how is needed. Let’s look at two methods.

Method 1: className

In the component, alias className as class and export it.

<script>
  let className = '';
  export { className as class };
</script>
 
<div {...$$restProps} class={className}>...</div>

Advantages

  • It’s declarative.
    • Intuitive and good for reusing variables.

Disadvantages

  • The syntax can seem a bit unfamiliar.
  • The code is longer. Not very elegant.

Open Source Examples

Method 2: $$props.class

Svelte’s $$props is a special variable that contains all properties passed to the component. It can be used to easily handle the class attribute.

<div {...$$restProps} class={$$props.class}>...</div>

Advantages

  • The code is concise.

Disadvantages

  • There are constraints on where $$restProps can be used.
  • <div class="btn {$$props.class}" {...$$restProps}>...</div>
    <!-- 🚨 The `class` attribute in `$$restProps` remains, overriding the original content. -->

Open Source Examples

In Conclusion

As always in coding, there is no single right answer.
You can establish conventions that suit your development environment and team’s preferences. Try out the examples on svelte REPL, and refer to open-source codes to make your decision!