Solid.js vs Aurelia 2 Comparison
Reactivity
Reactivity is a core feature in both Solid.js and Aurelia 2, allowing developers to build dynamic and responsive applications. Let’s explore how each framework handles 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.
Aurelia 2
name.html
<h1>Hello ${name}</h1>
name.ts
In Aurelia 2, state is typically managed using properties within components, and the view is updated through data binding.
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
.
Aurelia 2
name.html
<h1>Hello ${name}</h1>
name.ts
In Aurelia 2, state updates are made by directly assigning new values to properties, 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.
Aurelia 2
double-count.html
<div>${doubleCount}</div>
double-count.ts
In Aurelia 2, computed properties are defined using getter methods, allowing for dynamic updates based on other data.
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>;
}
Aurelia 2
hello-world.html
<h1>Hello world</h1>
Styling
Styling in Solid.js and Aurelia 2 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;
}
Aurelia 2
css-style.html
<h1 class="title">I am red</h1>
<button style="font-size: 10rem;">I am a button</button>
css-style.css
.title {
color: red;
}
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>
);
}
Aurelia 2
colors.html
<ul>
<li repeat.for="color of colors">${color}</li>
</ul>
colors.ts
Event click
Event handling in Solid.js and Aurelia 2 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>
</>
);
}
Aurelia 2
counter.html
<p>Counter: ${count}</p>
<button click.trigger="incrementCount">+1</button>
counter.ts
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" />;
}
Aurelia 2
input-focused.html
<input ref="inputElement" />
input-focused.ts
Conditional
Conditional rendering in Solid.js and Aurelia 2 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>
</>
);
}
Aurelia 2
traffic-light.html
<button click.trigger="nextLight()">Next light</button>
<p>Light is: ${light}</p>
<p switch.bind="light">
You must
<span case="red">STOP</span>
<span case="orange">SLOW DOWN</span>
<span case="green">GO</span>
</p>
traffic-light.ts
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>;
}
Aurelia 2
page-title.html
<p>Page title is: ${pageTitle}</p>
page-title.ts
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>;
}
Aurelia 2
time.html
<p>Current time: ${time}</p>
time.ts
Component composition
Component composition in Solid.js and Aurelia 2 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
/>
);
}
Aurelia 2
app.html
<user-profile
name.bind
age.bind
favourite-colors.bind="colors"
is-available.bind="available"
></user-profile>
app.ts
user-profile.html
user-profile.ts
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>
</>
);
}
Aurelia 2
app.html
<p>Can I come ?</p>
<answer-button action-handler.bind="handleAnswer"></answer-button>
<p style="font-size: 50px">${isHappy ? "😀" : "😥"}</p>
app.ts
answer-button.html
answer-button.ts
Slot
Solid.js
App.jsx
import FunnyButton from "./FunnyButton.jsx";
export default function App() {
return <FunnyButton>Click me!</FunnyButton>;
}
Aurelia 2
app.html
<funny-button>Click me !</funny-button>
funny-button.html
Slot fallback
Solid.js
App.jsx
import FunnyButton from "./FunnyButton.jsx";
export default function App() {
return (
<>
<FunnyButton />
<FunnyButton>I got content!</FunnyButton>
</>
);
}
Aurelia 2
app.html
<funny-button></funny-button> <funny-button>Click me !</funny-button>
funny-button.html
Context
Context management in Solid.js and Aurelia 2 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>
</>
);
}
Aurelia 2
app.html
<h1>Welcome back, {{ user.username }}</h1>
<user-profile />
app.ts
user-profile.html
user-profile.ts
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} />
</>
);
}
Aurelia 2
input-hello.html
<p>${text}</p>
<input value.bind />
input-hello.ts
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>
</>
);
}
Aurelia 2
is-available.html
<input id="is-available" type="checkbox" checked.bind="isAvailable" />
<label for="is-available">Is available</label>: ${isAvailable}
is-available.ts
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>
</>
);
}
Aurelia 2
pick-pill.html
<div>Picked: ${picked}</div>
<input id="blue-pill" checked.bind="picked" type="radio" value="blue" />
<label for="blue-pill">Blue pill</label>
<input id="red-pill" checked.bind="picked" type="radio" value="red" />
<label for="red-pill">Red pill</label>
pick-pill.ts
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>
);
}
Aurelia 2
color-select.html
<select value.bind="selectedColorId">
<option value="">Select A Color</option>
<option
repeat.for="color of colors"
value.bind="color.id"
disabled.bind="color.isDisabled"
>
${color.text}
</option>
</select>
color-select.ts
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
Aurelia 2
index.html
<!DOCTYPE html>
<html>
<head>
<script type="module" src="./main.ts"></script>
</head>
<body>
<app></app>
</body>
</html>
main.ts
app.html
app.ts
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>
);
}
Aurelia 2
app.html
<template promise.bind="useFetchUsers.fetchData()">
<p pending>Fetching users...</p>
<p catch>An error ocurred while fetching users</p>
<ul then.from-view="users">
<li repeat.for="user of users">
<img src.bind="user.picture.thumbnail" alt="user" />
<p>${ user.name.first } ${ user.name.last }</p>
</li>
</ul>
</template>
app.ts
UseFetchUsers.ts
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