Components & Templating
In React every component is a function that returns JSX. In Svelte every component is a .svelte file that combines script, markup, and styles in a single, familiar HTML-like format. No JSX, no className, no separate CSS file needed.
This module walks you through the core building blocks:
| Lesson | Concept |
|---|---|
| This page | .svelte file structure vs React function components |
| Props | $props() rune vs React props destructuring |
| Template blocks | {#if}, {#each}, {#await} vs JSX ternaries and .map() |
| Events | onclick={fn} vs onClick={fn} |
| Snippets & children | {#snippet} / {@render} vs React children |
| Bindings | bind:value vs controlled inputs |
| Styles | Scoped <style> vs CSS Modules / CSS-in-JS |
A .svelte file has three sections
Section titled “A .svelte file has three sections”flowchart TB file([".svelte file"]) file --> script["<script> — component logic (JS/TS, runes)"] file --> markup["markup — HTML template (no JSX, no return)"] file --> style["<style> — scoped CSS (auto-scoped to this component)"]
Only the markup section is required. <script> and <style> are optional.
React component vs Svelte component
Section titled “React component vs Svelte component”// Greeting.jsxfunction Greeting({ name }) { return <h1>Hello, {name}!</h1>;}export default Greeting;<!-- Greeting.svelte --><script> let { name } = $props();</script>
<h1>Hello, {name}!</h1>The markup in a .svelte file is the entire file body — no return statement, no parentheses, no JSX pragma.