Développer des interfaces utilisateur réactives et modulaires Jaime Arias · 24 juin 2026 CNRS, Laboratoire d'Informatique de Paris Nord (LIPN) Code on GitHub github.com/himito/tutorial-vuejs 1 / 67
session. Each Vue concept unlocks one feature — by the end, this app is yours. IT'S LIVE — ADD A TASK Add & render tasks Toggle completion, delete Filter: all / todo / done Live count of what's done ▸ My Task Manager Enter a new task... Add 3 of 4 tasks completed all todo done Write the slides ✕ Buy the train tickets ✕ Configure the laptop ✕ Ask for some feedback ✕ 3 / 67
for building web user interfaces that is approachable, performant and versatile. Approachable Builds on standard HTML, CSS & JavaScript — an intuitive API and world- class documentation. Performant A truly reactive, compiler-optimized rendering system that rarely needs manual tuning. Versatile An incrementally adoptable ecosystem that scales from a tiny library to a full framework. 6 / 67
You @youyuxi · Singapore Creator of Vue & Vite, founder of VoidZero — Vue is independent, community- backed open source. Dec 2013 · v0.6 The first release of Vue.js Oct 2015 · v1.0 First stable version Sep 2016 · v2.0 Major rewrite Sep 2020 · v3.0 what we use today Composition API & first-class TypeScript support Dec 2023 Vue 2 reaches end-of-life 7 / 67
on Node.js. Use nvm to install and manage the latest LTS — three commands, top to bottom. nodejs.org/download 1 Install nvm ❯ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/install.sh | bash 2 Install the latest LTS ❯ nvm install 24 3 Verify it works ❯ node -v → v24.0.2 ❯ npm -v → 11.3.0 11 / 67
official project generator. It asks a few questions, then it's ready. vuejs.org · quick start i Then: cd todo-app → npm install → npm run dev ❯ npm create vue@latest ┌ Vue.js - The Progressive JavaScript Framework │ ◇ Project name (target directory): │ todo-app │ ◇ Use TypeScript? │ Yes │ ◇ Select features to include in your project: │ Router (SPA), Linter (error prevention), Prettier │ ◇ Select experimental features to include: │ none │ ◇ Skip all example code and start with a blank Vue project? │ Yes └ Copy 12 / 67
one editor extension, plus two helpers that keep your code clean. All set up by create-vue . Vue - Official editor The VS Code extension: syntax, IntelliSense and formatting for .vue files. E ESLint catch mistakes eslint-plugin-vue flags problems right in the editor, before you run anything. P Prettier consistent style Formats your code on save, so the whole team's files look the same. ! Error Lens inline errors Shows errors and warnings inline, right on the line — no hovering needed. 14 / 67
Tasks App with Tailwind. With Vite it's four steps — then utility classes work everywhere. tailwindcss.com · vite 1 Install the package ❯ npm install tailwindcss @tailwindcss/vite 2 Register the plugin · vite.config.ts import tailwindcss from '@tailwindcss/vite' plugins: [vue(), tailwindcss()] 3 Add the import · src/assets/style.css @import "tailwindcss"; 4 Load it in the app · src/main.ts import './assets/style.css'; 15 / 67
the ready-made markup and styles, then we make it reactive. MARKUP 1 Open bit.ly/todo-html , copy inside <body> 2 Paste into the <template> of App.vue STYLES 3 Open bit.ly/todo-style , copy everything 4 Paste into src/assets/style.css 17 / 67
JavaScript swaps only the part that changes — the server just sends data. ✓ fast, app-like navigation ! slower first load · needs JS TRADITIONAL · MULTI-PAGE Home ↻ reload About ↻ reload Tasks Every click fetches a whole new HTML page from the server — the screen blanks and reloads. SINGLE-PAGE · VUE Home About Tasks loaded once ⇄ swap view JavaScript swaps just the content instantly. The server only sends JSON data — no full reload. 19 / 67
vs. Composition API The same counter component, written both ways — same result, different organization. 2 Options API Vue 2 style · grouped by option – Logic split across data / methods – Refers to state through this 3 Composition API we use this Vue 3 · <script setup lang="ts"> · grouped by feature ✓ Less boilerplate ✓ Related logic stays together ✓ First-class TypeScript support <script lang="ts"> 1 export default { 2 data() { 3 return { count: 0 }; 4 }, 5 methods: { 6 increment() { 7 this.count++; 8 }, 9 }, 10 }; 11 </script> 12 <script setup lang="ts"> 1 import { ref } from "vue"; 2 3 const count = ref(0); 4 5 function increment() { 6 count.value++; 7 } 8 </script> 9 Copy Copy 21 / 67
In the DOM? Added / removed Always present First render Lazy — skipped if false Always rendered Cost to toggle Higher Very cheap • Reach for v-if when the condition rarely changes ⇄ Reach for v-show when you toggle it often 32 / 67
in doubt, reach for ref() . state.js LIVE › "state is still" 0 import { reactive } from 'vue' 1 2 const state = reactive({ count: 0 }) 3 4 // destructuring breaks the reactive link 5 let { count } = state 6 count++ 7 8 console.log('state is still', state.count) 9 Copy 37 / 67
Holds Any value — primitives too Objects & arrays only Access in JS Through .value Direct properties Destructuring Keeps reactivity Breaks reactivity ★ Default to ref — works for everything • Use reactive for a group of related object state 38 / 67
and listen on @input . Works — but verbose. App.vue LIVE THE TWO-WAY LOOP state · text :value ↓ render @input ↑ update <input> read the state into the field, write the typed value back. <script setup lang="ts"> 1 import { ref } from 'vue' 2 const text = ref('') 3 </script> 4 5 <template> 6 <div class="flex items-center w-full max-w-md"> 7 <input :value="text" @input="e => text = e.target.value.toUpperCase()" 8 class="flex-grow input-full" placeholder="Type in lowercase..." /> 9 <span class="ml-4 text-gray-500">{{ text.length }}</span> 10 </div> 11 </template> 12 RESULT Type in lowercase... 0 Copy 42 / 67
its structure, style and behavior. An app is a tree of them — components nested inside components. our Tasks App, decomposed → COMPONENT TREE App.vue AddTaskForm.vue TaskList.vue TaskItem.vue × 3 FilterButtons.vue App.vue AddTaskForm.vue TaskList.vue TaskItem.vue FilterButtons.vue 52 / 67
Manager Enter a new task... Add 3 of 4 tasks completed all todo done Write the slides ✕ Buy the train tickets ✕ Configure the laptop ✕ Ask for some feedback ✕ 65 / 67