Solid.js vs Vue 2 Comparison
Reactivity
Reactivity is a core feature in both Solid.js and Vue 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.
Vue 2
Name.vue
<script>
export default {
data() {
return {
name: "John",
};
},
};
</script>
<template>
<h1>Hello {{ name }}</h1>
</template>
Vue 2 uses a data object to declare state, with properties that automatically update the UI when their values change.
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
.
Vue 2
Name.vue
<script>
export default {
data() {
return {
name: "John",
};
},
created() {
this.name = "Jane";
},
};
</script>
<template>
<h1>Hello {{ name }}</h1>
</template>
In Vue 2, state updates can be made by directly assigning new values to data 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.
Vue 2
DoubleCount.vue
<script>
export default {
data() {
return {
count: 10,
};
},
computed: {
doubleCount() {
return this.count * 2;
},
},
};
</script>
<template>
<div>{{ doubleCount }}</div>
</template>
Vue 2 uses computed properties 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>;
}
Vue 2
HelloWorld.vue
<template>
<h1>Hello world</h1>
</template>
Styling
Styling in Solid.js and Vue 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;
}
Vue 2
CssStyle.vue
<template>
<div>
<h1 class="title">I am red</h1>
<button style="font-size: 10rem">I am a button</button>
</div>
</template>
<style scoped>
.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>
);
}
Vue 2
Colors.vue
<script>
export default {
data() {
return {
colors: ["red", "green", "blue"],
};
},
};
</script>
<template>
<ul>
<li v-for="color in colors" :key="color">
{{ color }}
</li>
</ul>
</template>
Event click
Event handling in Solid.js and Vue 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>
</>
);
}
Vue 2
Counter.vue
<script>
export default {
data() {
return {
count: 0,
};
},
methods: {
incrementCount() {
this.count++;
},
},
};
</script>
<template>
<div>
<p>Counter: {{ count }}</p>
<button @click="incrementCount">+1</button>
</div>
</template>
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" />;
}
Vue 2
InputFocused.vue
<script>
export default {
mounted() {
this.$refs.inputElement.focus();
},
};
</script>
<template>
<input ref="inputElement" />
</template>
Conditional
Conditional rendering in Solid.js and Vue 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>
</>
);
}
Vue 2
TrafficLight.vue
<script>
export default {
data() {
return {
TRAFFIC_LIGHTS: ["red", "orange", "green"],
lightIndex: 0,
};
},
computed: {
light() {
return this.TRAFFIC_LIGHTS[this.lightIndex];
},
},
methods: {
nextLight() {
this.lightIndex = (this.lightIndex + 1) % this.TRAFFIC_LIGHTS.length;
},
},
};
</script>
<template>
<div>
<button @click="nextLight">Next light</button>
<p>Light is: {{ light }}</p>
<p>
You must
<span v-if="light === 'red'">STOP</span>
<span v-else-if="light === 'orange'">SLOW DOWN</span>
<span v-else-if="light === 'green'">GO</span>
</p>
</div>
</template>
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>;
}
Vue 2
PageTitle.vue
<script>
export default {
data() {
return {
pageTitle: "",
};
},
mounted() {
this.pageTitle = document.title;
},
};
</script>
<template>
<p>Page title: {{ pageTitle }}</p>
</template>
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>;
}
Vue 2
Time.vue
<script>
export default {
data() {
return {
time: new Date().toLocaleTimeString(),
timer: null,
};
},
mounted() {
this.timer = setInterval(() => {
this.time = new Date().toLocaleTimeString();
}, 1000);
},
beforeDestroy() {
clearInterval(this.timer);
},
};
</script>
<template>
<p>Current time: {{ time }}</p>
</template>
Component composition
Component composition in Solid.js and Vue 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
/>
);
}
Vue 2
App.vue
<script>
import UserProfile from "./UserProfile.vue";
export default {
components: {
UserProfile,
},
};
</script>
<template>
<UserProfile
name="John"
:age="20"
:favorite-colors="['green', 'blue', 'red']"
is-available
/>
</template>
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>
</>
);
}
Vue 2
App.vue
<script>
import AnswerButton from "./AnswerButton.vue";
export default {
components: {
AnswerButton,
},
data() {
return {
isHappy: true,
};
},
methods: {
onAnswerNo() {
this.isHappy = false;
},
onAnswerYes() {
this.isHappy = true;
},
},
};
</script>
<template>
<div>
<p>Are you happy?</p>
<AnswerButton @yes="onAnswerYes" @no="onAnswerNo" />
<p style="font-size: 50px">
{{ isHappy ? "😀" : "😥" }}
</p>
</div>
</template>
Slot
Solid.js
App.jsx
import FunnyButton from "./FunnyButton.jsx";
export default function App() {
return <FunnyButton>Click me!</FunnyButton>;
}
Vue 2
App.vue
<script>
import FunnyButton from "./FunnyButton.vue";
export default {
components: {
FunnyButton,
},
};
</script>
<template>
<FunnyButton> Click me! </FunnyButton>
</template>
Slot fallback
Solid.js
App.jsx
import FunnyButton from "./FunnyButton.jsx";
export default function App() {
return (
<>
<FunnyButton />
<FunnyButton>I got content!</FunnyButton>
</>
);
}
Vue 2
App.vue
<script>
import FunnyButton from "./FunnyButton.vue";
export default {
components: {
FunnyButton,
},
};
</script>
<template>
<div>
<FunnyButton />
<FunnyButton> I got content! </FunnyButton>
</div>
</template>
Context
Context management in Solid.js and Vue 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>
</>
);
}
Vue 2
App.vue
<script>
import UserProfile from "./UserProfile.vue";
export default {
components: { UserProfile },
provide() {
return {
user: Object.assign(this.user, {
updateUsername: this.updateUsername,
}),
};
},
data() {
return {
user: {
id: 1,
username: "unicorn42",
email: "unicorn42@example.com",
},
};
},
methods: {
updateUsername(newUsername) {
this.user.username = newUsername;
},
},
};
</script>
<template>
<div>
<h1>Welcome back, {{ user.username }}</h1>
<UserProfile />
</div>
</template>
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} />
</>
);
}
Vue 2
InputHello.vue
<script>
export default {
data() {
return {
text: "Hello World",
};
},
};
</script>
<template>
<div>
<p>{{ text }}</p>
<input v-model="text" />
</div>
</template>
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>
</>
);
}
Vue 2
IsAvailable.vue
<script>
export default {
data() {
return {
isAvailable: true,
};
},
};
</script>
<template>
<div>
<input id="is-available" v-model="isAvailable" type="checkbox" />
<label for="is-available">Is available</label>
</div>
</template>
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>
</>
);
}
Vue 2
PickPill.vue
<script>
export default {
data() {
return {
picked: "red",
};
},
};
</script>
<template>
<div>
<div>Picked: {{ picked }}</div>
<input id="blue-pill" v-model="picked" type="radio" value="blue" />
<label for="blue-pill">Blue pill</label>
<input id="red-pill" v-model="picked" type="radio" value="red" />
<label for="red-pill">Red pill</label>
</div>
</template>
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>
);
}
Vue 2
ColorSelect.vue
<script>
export default {
data() {
return {
selectedColorId: 2,
colors: [
{ id: 1, text: "red" },
{ id: 2, text: "blue" },
{ id: 3, text: "green" },
{ id: 4, text: "gray", isDisabled: true },
],
};
},
};
</script>
<template>
<select v-model="selectedColorId">
<option
v-for="color in colors"
:key="color.id"
:value="color.id"
:disabled="color.isDisabled"
>
{{ color.text }}
</option>
</select>
</template>
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
Vue 2
index.html
<!DOCTYPE html>
<html>
<body>
<div id="app"></div>
<script type="module" src="./main.js"></script>
</body>
</html>
main.js
App.vue
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>
);
}
Vue 2
App.vue
<script>
export default {
data() {
return {
isLoading: false,
error: undefined,
users: undefined,
};
},
mounted() {
this.fetchData();
},
methods: {
async fetchData() {
this.isLoading = true;
try {
const response = await fetch("https://randomuser.me/api/?results=3");
const { results: users } = await response.json();
this.users = users;
this.error = undefined;
} catch (error) {
this.error = error;
} finally {
this.users = undefined;
this.isLoading = false;
}
},
},
};
</script>
<template>
<p v-if="isLoading">Fetching users...</p>
<p v-else-if="error">An error ocurred while fetching users</p>
<ul v-else-if="users">
<li v-for="user in users" :key="user.login.uuid">
<img :src="user.picture.thumbnail" alt="user" />
<p>
{{ user.name.first }}
{{ user.name.last }}
</p>
</li>
</ul>
</template>
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