Solid.js vs Svelte 4 Comparison
Reactivity
Reactivity is a fundamental aspect of both Solid.js and Svelte 4, enabling developers to create dynamic and interactive applications. Let’s delve into how each framework manages state declaration, updates, and computed properties.
Declare state
Solid.js
Name.jsx
import { createSignal } from "solid-js";
export default function Name() {
const [name] = createSignal("John");
return <h1>Hello {name()}</h1>;
}
In Solid.js, state is managed using signals, which are functions that return the current state and can be called to update it.
Svelte 4
Name.svelte
<script>
let name = "John";
</script>
<h1>Hello {name}</h1>
Svelte 4 uses a more declarative approach, where state is declared as variables within a <script>
tag, and changes to these variables automatically update the UI.
Update state
Solid.js
Name.jsx
import { createSignal } from "solid-js";
export default function Name() {
const [name, setName] = createSignal("John");
setName("Jane");
return <h1>Hello {name()}</h1>;
}
State updates in Solid.js are performed by calling the setter function returned by createSignal
.
Svelte 4
Name.svelte
<script>
let name = "John";
name = "Jane";
</script>
<h1>Hello {name}</h1>
In Svelte 4, updating state is as simple as reassigning the variable, with the UI automatically reflecting the change.
Computed state
Solid.js
DoubleCount.jsx
import { createSignal } from "solid-js";
export default function DoubleCount() {
const [count] = createSignal(10);
const doubleCount = () => count() * 2;
return <div>{doubleCount()}</div>;
}
Computed properties in Solid.js are functions that derive values from other state, recalculating when dependencies change.
Svelte 4
DoubleCount.svelte
<script>
let count = 10;
$: doubleCount = count * 2;
</script>
<div>{doubleCount}</div>
Svelte 4 uses reactive statements, denoted by $:
, to automatically update derived values when dependencies change.
Templating
Templating in both frameworks allows for the creation of reusable and dynamic UI components.
Minimal template
Solid.js
HelloWorld.jsx
export default function HelloWorld() {
return <h1>Hello World!</h1>;
}
Svelte 4
HelloWorld.svelte
<h1>Hello world</h1>
Styling
Styling in Solid.js and Svelte 4 can be managed using CSS, with support for scoped styles and CSS modules.
Solid.js
CssStyle.jsx
import "./style.css";
export default function CssStyle() {
return (
<>
<h1 class="title">I am red</h1>
<button style={{ "font-size": "10rem" }}>I am a button</button>
</>
);
}
style.css
.title {
color: red;
}
Svelte 4
CssStyle.svelte
<h1 class="title">I am red</h1>
<button style="font-size: 10rem;">I am a button</button>
<style>
.title {
color: red;
}
</style>
Loop
Loops in both frameworks allow for the iteration over collections to dynamically generate UI elements.
Solid.js
Colors.jsx
import { For } from "solid-js";
export default function Colors() {
const colors = ["red", "green", "blue"];
return (
<ul>
<For each={colors}>{(color) => <li>{color}</li>}</For>
</ul>
);
}
Svelte 4
Colors.svelte
<script>
const colors = ["red", "green", "blue"];
</script>
<ul>
{#each colors as color (color)}
<li>{color}</li>
{/each}
</ul>
Event click
Event handling in Solid.js and Svelte 4 is intuitive, allowing developers to respond to user interactions.
Solid.js
Counter.jsx
import { createSignal } from "solid-js";
export default function Counter() {
const [count, setCount] = createSignal(0);
function incrementCount() {
setCount(count() + 1);
}
return (
<>
<p>Counter: {count()}</p>
<button onClick={incrementCount}>+1</button>
</>
);
}
Svelte 4
Counter.svelte
<script>
let count = 0;
function incrementCount() {
count++;
}
</script>
<p>Counter: {count}</p>
<button on:click={incrementCount}>+1</button>
Dom ref
DOM references in both frameworks allow for direct manipulation of DOM elements.
Solid.js
InputFocused.jsx
import { onMount } from "solid-js";
export default function InputFocused() {
let inputElement;
onMount(() => inputElement.focus());
return <input ref={inputElement} type="text" />;
}
Svelte 4
InputFocused.svelte
<script>
import { onMount } from "svelte";
let inputElement;
onMount(() => {
inputElement.focus();
});
</script>
<input bind:this={inputElement} />
Conditional
Conditional rendering in Solid.js and Svelte 4 allows for dynamic UI updates based on application state.
Solid.js
TrafficLight.jsx
import { createSignal, Switch, Match } from "solid-js";
const TRAFFIC_LIGHTS = ["red", "orange", "green"];
export default function TrafficLight() {
const [lightIndex, setLightIndex] = createSignal(0);
const light = () => TRAFFIC_LIGHTS[lightIndex()];
function nextLight() {
setLightIndex((lightIndex() + 1) % TRAFFIC_LIGHTS.length);
}
return (
<>
<button onClick={nextLight}>Next light</button>
<p>Light is: {light()}</p>
<p>
You must
<Switch>
<Match when={light() === "red"}>
<span>STOP</span>
</Match>
<Match when={light() === "orange"}>
<span>SLOW DOWN</span>
</Match>
<Match when={light() === "green"}>
<span>GO</span>
</Match>
</Switch>
</p>
</>
);
}
Svelte 4
TrafficLight.svelte
<script>
const TRAFFIC_LIGHTS = ["red", "orange", "green"];
let lightIndex = 0;
$: light = TRAFFIC_LIGHTS[lightIndex];
function nextLight() {
lightIndex = (lightIndex + 1) % TRAFFIC_LIGHTS.length;
}
</script>
<button on:click={nextLight}>Next light</button>
<p>Light is: {light}</p>
<p>
You must
{#if light === "red"}
<span>STOP</span>
{:else if light === "orange"}
<span>SLOW DOWN</span>
{:else if light === "green"}
<span>GO</span>
{/if}
</p>
Lifecycle
Lifecycle hooks in both frameworks provide a way to execute code at specific points in a component’s lifecycle.
On mount
Solid.js
PageTitle.jsx
import { createSignal, onMount } from "solid-js";
export default function PageTitle() {
const [pageTitle, setPageTitle] = createSignal("");
onMount(() => {
setPageTitle(document.title);
});
return <p>Page title: {pageTitle()}</p>;
}
Svelte 4
PageTitle.svelte
<script>
import { onMount } from "svelte";
let pageTitle = "";
onMount(() => {
pageTitle = document.title;
});
</script>
<p>Page title: {pageTitle}</p>
On unmount
Solid.js
Time.jsx
import { createSignal, onCleanup } from "solid-js";
export default function Time() {
const [time, setTime] = createSignal(new Date().toLocaleTimeString());
const timer = setInterval(() => {
setTime(new Date().toLocaleTimeString());
}, 1000);
onCleanup(() => clearInterval(timer));
return <p>Current time: {time()}</p>;
}
Svelte 4
Time.svelte
<script>
import { onDestroy } from "svelte";
let time = new Date().toLocaleTimeString();
const timer = setInterval(() => {
time = new Date().toLocaleTimeString();
}, 1000);
onDestroy(() => clearInterval(timer));
</script>
<p>Current time: {time}</p>
Component composition
Component composition in Solid.js and Svelte 4 allows for the creation of complex UIs from smaller, reusable components.
Props
Solid.js
App.jsx
import UserProfile from "./UserProfile.jsx";
export default function App() {
return (
<UserProfile
name="John"
age={20}
favouriteColors={["green", "blue", "red"]}
isAvailable
/>
);
}
Svelte 4
App.svelte
<script>
import UserProfile from "./UserProfile.svelte";
</script>
<UserProfile
name="John"
age={20}
favouriteColors={["green", "blue", "red"]}
isAvailable
/>
Emit to parent
Solid.js
App.jsx
import { createSignal } from "solid-js";
import AnswerButton from "./AnswerButton.jsx";
export default function App() {
const [isHappy, setIsHappy] = createSignal(true);
function onAnswerNo() {
setIsHappy(false);
}
function onAnswerYes() {
setIsHappy(true);
}
return (
<>
<p>Are you happy?</p>
<AnswerButton onYes={onAnswerYes} onNo={onAnswerNo} />
<p style={{ "font-size": "50px" }}>{isHappy() ? "😀" : "😥"}</p>
</>
);
}
Svelte 4
App.svelte
<script>
import AnswerButton from "./AnswerButton.svelte";
let isHappy = true;
function onAnswerNo() {
isHappy = false;
}
function onAnswerYes() {
isHappy = true;
}
</script>
<p>Are you happy?</p>
<AnswerButton on:yes={onAnswerYes} on:no={onAnswerNo} />
<p style="font-size: 50px;">{isHappy ? "😀" : "😥"}</p>
Slot
Solid.js
App.jsx
import FunnyButton from "./FunnyButton.jsx";
export default function App() {
return <FunnyButton>Click me!</FunnyButton>;
}
Svelte 4
App.svelte
<script>
import FunnyButton from "./FunnyButton.svelte";
</script>
<FunnyButton>Click me!</FunnyButton>
Slot fallback
Solid.js
App.jsx
import FunnyButton from "./FunnyButton.jsx";
export default function App() {
return (
<>
<FunnyButton />
<FunnyButton>I got content!</FunnyButton>
</>
);
}
Svelte 4
App.svelte
<script>
import FunnyButton from "./FunnyButton.svelte";
</script>
<FunnyButton />
<FunnyButton>I got content!</FunnyButton>
Context
Context management in Solid.js and Svelte 4 allows for the sharing of data and functionality across components.
Solid.js
App.jsx
import { createSignal } from "solid-js";
import { UserContext } from "./UserContext";
import UserProfile from "./UserProfile";
export default function App() {
const [user, setUser] = createSignal({
id: 1,
username: "unicorn42",
email: "unicorn42@example.com",
});
function updateUsername(newUsername) {
setUser({ ...user(), username: newUsername });
}
return (
<>
<h1>Welcome back, {user().username}</h1>
<UserContext.Provider value={[user, updateUsername]}>
<UserProfile />
</UserContext.Provider>
</>
);
}
Svelte 4
App.svelte
<script>
import { setContext } from "svelte";
import UserProfile from "./UserProfile.svelte";
import createUserStore from "./createUserStore.js";
const userStore = createUserStore({
id: 1,
username: "unicorn42",
email: "unicorn42@example.com",
});
setContext("user", userStore);
</script>
<h1>Welcome back, {$userStore.username}</h1>
<UserProfile />
Form input
Form inputs in both frameworks support two-way data binding, making it easy to manage form state.
Input text
Solid.js
InputHello.jsx
import { createSignal } from "solid-js";
export default function InputHello() {
const [text, setText] = createSignal("Hello world");
function handleChange(event) {
setText(event.target.value);
}
return (
<>
<p>{text()}</p>
<input value={text()} onInput={handleChange} />
</>
);
}
Svelte 4
InputHello.svelte
<script>
let text = "Hello World";
</script>
<p>{text}</p>
<input bind:value={text} />
Checkbox
Solid.js
IsAvailable.jsx
import { createSignal } from "solid-js";
export default function IsAvailable() {
const [isAvailable, setIsAvailable] = createSignal(false);
function handleChange() {
setIsAvailable((previousValue) => !previousValue);
}
return (
<>
<input
id="is-available"
type="checkbox"
checked={isAvailable()}
onChange={handleChange}
/>
<label for="is-available">Is available</label>
</>
);
}
Svelte 4
IsAvailable.svelte
<script>
let isAvailable = false;
</script>
<input id="is-available" type="checkbox" bind:checked={isAvailable} />
<label for="is-available">Is available</label>
Radio
Solid.js
PickPill.jsx
import { createSignal } from "solid-js";
export default function PickPill() {
const [picked, setPicked] = createSignal("red");
function handleChange(event) {
setPicked(event.target.value);
}
return (
<>
<div>Picked: {picked()}</div>
<input
id="blue-pill"
checked={picked() === "blue"}
type="radio"
value="blue"
onChange={handleChange}
/>
<label for="blue-pill">Blue pill</label>
<input
id="red-pill"
checked={picked() === "red"}
type="radio"
value="red"
onChange={handleChange}
/>
<label for="red-pill">Red pill</label>
</>
);
}
Svelte 4
PickPill.svelte
<script>
let picked = "red";
</script>
<div>Picked: {picked}</div>
<input id="blue-pill" bind:group={picked} type="radio" value="blue" />
<label for="blue-pill">Blue pill</label>
<input id="red-pill" bind:group={picked} type="radio" value="red" />
<label for="red-pill">Red pill</label>
Select
Solid.js
ColorSelect.jsx
import { createSignal, For } from "solid-js";
const colors = [
{ id: 1, text: "red" },
{ id: 2, text: "blue" },
{ id: 3, text: "green" },
{ id: 4, text: "gray", isDisabled: true },
];
export default function ColorSelect() {
const [selectedColorId, setSelectedColorId] = createSignal(2);
function handleChange(event) {
setSelectedColorId(event.target.value);
}
return (
<select value={selectedColorId()} onChange={handleChange}>
<For each={colors}>
{(color) => (
<option value={color.id} disabled={color.isDisabled}>
{color.text}
</option>
)}
</For>
</select>
);
}
Svelte 4
ColorSelect.svelte
<script>
let selectedColorId = 2;
const colors = [
{ id: 1, text: "red" },
{ id: 2, text: "blue" },
{ id: 3, text: "green" },
{ id: 4, text: "gray", isDisabled: true },
];
</script>
<select bind:value={selectedColorId}>
{#each colors as color}
<option value={color.id} disabled={color.isDisabled}>
{color.text}
</option>
{/each}
</select>
Webapp features
Webapp features in both frameworks include data fetching and rendering, with support for asynchronous operations.
Render app
Solid.js
index.html
<!DOCTYPE html>
<html>
<body>
<div id="app"></div>
<script type="module" src="./main.jsx"></script>
</body>
</html>
main.jsx
App.jsx
Svelte 4
index.html
<!DOCTYPE html>
<html>
<body>
<div id="app"></div>
<script type="module" src="./app.js"></script>
</body>
</html>
app.js
App.svelte
Fetch data
Solid.js
App.jsx
import { createResource, For, Switch, Match } from "solid-js";
async function fetchUsers() {
return (await fetch("https://randomuser.me/api/?results=3")).json();
}
export default function App() {
const [data] = createResource(fetchUsers);
const users = () => data()?.results;
return (
<Switch>
<Match when={data.loading}>
<p>Fetching users...</p>
</Match>
<Match when={data.error}>
<p>An error occurred while fetching users</p>
</Match>
<Match when={users()}>
<ul>
<For each={users()}>
{(user) => (
<li>
<img src={user.picture.thumbnail} alt="user" />
<p>
{user.name.first} {user.name.last}
</p>
</li>
)}
</For>
</ul>
</Match>
</Switch>
);
}
Svelte 4
App.svelte
<script>
import useFetchUsers from "./useFetchUsers";
const { isLoading, error, data: users } = useFetchUsers();
</script>
{#if $isLoading}
<p>Fetching users...</p>
{:else if $error}
<p>An error occurred while fetching users</p>
{:else if $users}
<ul>
{#each $users as user}
<li>
<img src={user.picture.thumbnail} alt="user" />
<p>
{user.name.first}
{user.name.last}
</p>
</li>
{/each}
</ul>
{/if}
useFetchUsers.js
Decouvrez plus d’Offres de la plateform ItGalaxy.io :
Découvrez notre gamme complète de services et formations pour accélérer votre carrière.
1. Nous contactez
- Description: Besoin de Formation et des Solutions cloud complètes pour vos applications
- Links:
2. Infra as a Service
- Description: Infrastructure cloud évolutive et sécurisée
- Links:
3. Projets Développeurs
- Description: Découvrez des opportunités passionnantes pour les développeurs
- Links:
4. Développeurs
- Description: Rejoignez notre communauté de développeurs
- Links:
5. Formations Complètes
- Description: Accédez à des formations professionnelles de haute qualité
- Links:
6. Marketplace
- Description: Découvrez notre place de marché de services
- Links:
7. Blogs
- Description: Découvrez nos blogs
- Links:
- comment creer une application mobile ?
- Comment monitorer un site web ?
- Command Checkout in git ?
- Comment git checkout to commit ?
- supprimer une branche git
- dockercoin
- kubernetes c est quoi
- architecture kubernetes
- Installer Gitlab Runner ?
- .gitlab-ci.yml exemples
- CI/CD
- svelte 5 vs solid
- svelte vs lit
- solidjs vs qwik
- alpine vs vue
- Plateform Freelance 2025
- Creation d’un site Web gratuitement
This website is powered by ItGalaxy.io