Skip to content

Class properties in Svelte

A handy trick to make your Svelte components feel even more like plain old HTML.

by Tony Sullivan • 2 min read min read

I’ve noticed an interesting pattern when a React developer gives Svelte a try - they almost immediately add a className property to their first Svelte component.

Don’t get me wrong, the power of dynamically adding classes to a component can save your butt. The term className is a dodge in the JSX world though since class is a reserved word in JavaScript. Here’s a quick trick to make your Svelte components feel even more like plain old HTML with a proper class property!

tl;dr; Check out the REPL example to see a working example.

First, the problem

With Svelte, you may think it’s as simple as

<script>
  export let class = "";
</script>

<div {class}>...</div>

Unfortunately you run smack into the same reserved word problem - Svelte treats the script as regular JavaSript (or TypeScript) and won’t allow a variable named class.

The workaround

If you’re like me you probably hit this once, banged your head against the nearest wall a couple times, then moved on to the obvious fix of renaming the prop to class.

<script>
  export let className = ''
</script>

<div class="{className}">...</div>

Writing Svelte is so close to HTML that you can almost forget there’s a framework at all…until you come across something like <Button className="send-btn"/>. Those four extra characters stand out like a sour thumb, flashing a big neon sign to remind you this isn’t actually HTML.

There’s an easy fix

<script>
  let className = ''
  export { className as class }
</script>

<div class="{className}">...</div>

That’s all there is to it! Internally the property is named className, avoiding JavaScript’s reserved word issue. Externally, though, the component has an optional property named class.

<button class="send-btn" />

Doesn’t that just feel right? No more JSX-like className property screaming “is this React!?!”

Conclusion

React is a very powerful framework and web development wouldn’t be where it is today without it. But when it comes to workarounds like renaming class to className, or camel casing CSS properties for that matter, it can feel freeing when you can move past those quirks and get back to the basics.