Étiquette : Dev. web

Formation Vue.js : Chapitre 3 – Réactivité et gestion d’état

Nous poursuivons avec le Chapitre 3 de la formation Vue.js, incluant les notions théoriques, les exemples de code, et le résultat final de l’atelier fil rouge : la gestion d’un tableau de tâches avec ref() et l’affichage du nombre de tâches terminées via un computed().

Chapitre 3 : Réactivité et gestion d’état

L’objectif est d’apprendre à gérer des données dynamiques avec ref() et reactive(), à utiliser computed() pour dériver des valeurs, et à afficher une liste de tâches avec v-for.

Notions à apprendre

1. ref() vs reactive()

  • ref() : pour les valeurs primitives (string, number, boolean) ou objets simples. Accès via .value
  • reactive() : pour les objets complexes. Pas besoin de .value (mais attention aux problèmes de réactivité lors de la réaffectation)

Recommandé : Utiliser ref() pour les tableaux et objets simples, surtout en <script setup>.

2. computed()

  • Crée une valeur dérivée, recalculée uniquement si ses dépendances changent
  • Très utile pour les filtres, totaux, statistiques

3. v-for pour boucler sur une liste

  • Syntaxe : v-for="item in list" :key="item.id"
  • Toujours utiliser :key pour une performance optimale et éviter les bugs de rendu

4. Mutation vs réactivité

  • Vue détecte les mutations sur les tableaux/objets via push(), splice(), item.property = value
  • Éviter : array = newArray → cela casse la réactivité. Utiliser array.splice(0, array.length, ...newArray) ou ref().value = newArray

Exemple de code : Gestion d’un tableau de tâches

<!-- src/App.vue (version simplifiée pour l’exemple) -->
<template>
  <div class="app">
    <h1>Mes tâches</h1>
    
    <div class="stats">
      <p>Total : {{ tasks.length }}</p>
      <p>Terminées : {{ doneTasks.length }}</p>
    </div>

    <ul class="task-list">
      <li v-for="task in tasks" :key="task.id" class="task-item">
        {{ task.title }} — <span :class="task.status">{{ task.status }}</span>
      </li>
    </ul>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue'

// Tableau de tâches réactif
const tasks = ref([
  { id: 1, title: 'Apprendre Vue.js', status: 'done' },
  { id: 2, title: 'Créer un composant', status: 'todo' },
  { id: 3, title: 'Gérer l’état', status: 'inprogress' }
])

// Computed : liste des tâches terminées
const doneTasks = computed(() => {
  return tasks.value.filter(task => task.status === 'done')
})
</script>

<style scoped>
.app {
  padding: 2rem;
  max-width: 600px;
  margin: 0 auto;
}

.stats {
  background: #f0f0f0;
  padding: 1rem;
  border-radius: 8px;
  margin-bottom: 1rem;
  display: flex;
  gap: 1rem;
  justify-content: space-between;
}

.task-list {
  list-style: none;
  padding: 0;
}

.task-item {
  background: #fff;
  border: 1px solid #ddd;
  padding: 0.75rem;
  margin: 0.5rem 0;
  border-radius: 6px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.task-item .done {
  color: #2ecc71;
  font-weight: bold;
}

.task-item .todo {
  color: #e74c3c;
}

.task-item .inprogress {
  color: #f39c12;
}
</style>

Atelier fil rouge : Afficher le nombre de tâches terminées

Objectif :

  • Déclarer un tableau de tâches dans App.vue avec ref()
  • Créer un computed() qui filtre les tâches avec status === 'done'
  • Afficher le nombre total de tâches et le nombre de tâches terminées
  • Afficher la liste des tâches avec leur statut

Résultat final : App.vue mis à jour

<!-- src/App.vue -->
<template>
  <div class="app">
    <header>
      <h1>Mon gestionnaire de tâches</h1>
      <p>Chapitre 3 : Réactivité et gestion d’état</p>
    </header>

    <main>
      <div class="stats">
        <p><strong>Total :</strong> {{ tasks.length }}</p>
        <p><strong>Terminées :</strong> {{ doneTasks.length }}</p>
      </div>

      <div class="task-list">
        <TaskCard 
          v-for="task in tasks" 
          :key="task.id"
          :title="task.title"
          :description="task.description"
          :status="task.status"
        />
      </div>
    </main>

    <footer>
      <p>Vue.js — Formation Chapitre 3</p>
    </footer>
  </div>
</template>

<script setup>
import { ref, computed } from 'vue'
import TaskCard from './components/TaskCard.vue'

// Tableau de tâches réactif
const tasks = ref([
  { id: 1, title: 'Créer le composant TaskCard', description: 'Chapitre 2', status: 'done' },
  { id: 2, title: 'Gérer l’état avec ref()', description: 'Chapitre 3', status: 'todo' },
  { id: 3, title: 'Utiliser computed()', description: 'Chapitre 3', status: 'inprogress' }
])

// Computed : tâches terminées
const doneTasks = computed(() => {
  return tasks.value.filter(task => task.status === 'done')
})
</script>

<style scoped>
.app {
  font-family: Arial, sans-serif;
  max-width: 600px;
  margin: 2rem auto;
  padding: 2rem;
  border: 1px solid #ddd;
  border-radius: 8px;
  box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}

header h1 {
  color: #42b983;
  margin-bottom: 0.5rem;
}

header p {
  color: #666;
  font-size: 0.9rem;
}

.stats {
  background: #f0f0f0;
  padding: 1rem;
  border-radius: 8px;
  margin-bottom: 1rem;
  display: flex;
  gap: 1rem;
  justify-content: space-between;
}

.task-list {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

footer {
  margin-top: 2rem;
  text-align: center;
  font-size: 0.8rem;
  color: #999;
}
</style>

Explication du résultat

  • Le tableau tasks est déclaré avec ref() → il est réactif.
  • doneTasks est un computed() → il se met à jour automatiquement si tasks change.
  • Les tâches sont affichées avec v-for → chaque TaskCard reçoit ses props (title, description, status).
  • Le composant TaskCard est mis à jour pour afficher le statut (voir ci-dessous).

Mise à jour de TaskCard.vue (pour afficher le statut)

<!-- src/components/TaskCard.vue -->
<template>
  <div class="task-card" :class="status">
    <h3 class="task-title">{{ title }}</h3>
    <p class="task-description">{{ description }}</p>
    <span class="status-badge">{{ status }}</span>
  </div>
</template>

<script setup>
defineProps({
  title: {
    type: String,
    required: true
  },
  description: {
    type: String,
    default: 'Aucune description'
  },
  status: {
    type: String,
    default: 'todo',
    validator: (value) => ['todo', 'inprogress', 'done'].includes(value)
  }
})
</script>

<style scoped>
.task-card {
  background: #f9f9f9;
  border: 1px solid #ddd;
  border-radius: 8px;
  padding: 1rem;
  margin: 0.5rem 0;
  box-shadow: 0 2px 4px rgba(0,0,0,0.05);
  transition: transform 0.2s;
  position: relative;
}

.task-card:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}

.task-title {
  margin: 0 0 0.5rem 0;
  color: #333;
  font-size: 1.1rem;
}

.task-description {
  margin: 0;
  color: #666;
  font-size: 0.9rem;
  line-height: 1.4;
}

.status-badge {
  position: absolute;
  top: 0.5rem;
  right: 0.5rem;
  padding: 0.25rem 0.5rem;
  border-radius: 12px;
  font-size: 0.75rem;
  font-weight: bold;
  color: white;
}

.task-card.todo .status-badge {
  background: #e74c3c;
}

.task-card.inprogress .status-badge {
  background: #f39c12;
}

.task-card.done .status-badge {
  background: #2ecc71;
}
</style>

Testez-le vous-même !

  1. Mettez à jour TaskCard.vue avec le code ci-dessus (ajout du statut).
  2. Mettez à jour App.vue avec le code du résultat final.
  3. Lancez le serveur :
npm run dev
  1. Ouvrez http://localhost:5173 → vous voyez :
  • Le nombre total et terminé de tâches
  • 3 cartes de tâches avec statut coloré

Prochain chapitre

Dans le chapitre 4, nous aborderons la gestion des événements et les formulaires : vous apprendrez à créer un formulaire pour ajouter une nouvelle tâche, avec validation et gestion des événements.

Tu as maintenant une liste de tâches dynamique, avec un compteur de tâches terminées, et un composant TaskCard qui affiche le statut. C’est la base de toute application de gestion de tâches !

Formation Vue.js : Chapitre 2 – Composants et props

Nous poursuivons avec le chapitre 2 complet de la formation Vue.js, incluant les notions théoriques, les exemples de code, et le résultat final de l’atelier fil rouge : la création d’un composant TaskCard réutilisable, affiché dans App.vue avec des données statiques.

Chapitre 2 : Composants et props

L’objectif de ce second chapitre est de comprendre comment créer des composants réutilisables, les importer dans d’autres composants, et les alimenter avec des données via des props.

Notions à apprendre

1. Qu’est-ce qu’un composant ?

Un composant Vue est un bloc de code (template, script, style) qui peut être réutilisé à plusieurs endroits. Il encapsule sa logique, son rendu et son style.

2. Création d’un composant

  • Fichier .vue avec <template>, <script setup>, <style>
  • Nom du fichier : PascalCase (ex: TaskCard.vue)
  • Import dans un autre composant avec import

3. Props (propriétés)

  • Permettent de passer des données d’un composant parent à un composant enfant
  • Définies avec defineProps() dans <script setup>
  • Typage optionnel avec TypeScript ou validation avec PropTypes

4. Événements personnalisés (emit)

  • Pour communiquer de l’enfant vers le parent
  • Utilise defineEmits() et $emit() (ou emit() dans <script setup>)

5. Slots

  • Permettent d’injecter du contenu HTML dynamique dans un composant
  • Syntaxe : <slot></slot> dans le composant, contenu entre les balises dans l’utilisation

Exemple de code : TaskCard.vue

<!-- src/components/TaskCard.vue -->
<template>
  <div class="task-card">
    <h3 class="task-title">{{ title }}</h3>
    <p class="task-description">{{ description }}</p>
  </div>
</template>

<script setup>
// Définition des props
defineProps({
  title: {
    type: String,
    required: true
  },
  description: {
    type: String,
    default: 'Aucune description'
  }
})
</script>

<style scoped>
.task-card {
  background: #f9f9f9;
  border: 1px solid #ddd;
  border-radius: 8px;
  padding: 1rem;
  margin: 0.5rem 0;
  box-shadow: 0 2px 4px rgba(0,0,0,0.05);
  transition: transform 0.2s;
}

.task-card:hover {
  transform: translateY(-2px);
  box-shadow: 0 4px 8px rgba(0,0,0,0.1);
}

.task-title {
  margin: 0 0 0.5rem 0;
  color: #333;
  font-size: 1.1rem;
}

.task-description {
  margin: 0;
  color: #666;
  font-size: 0.9rem;
  line-height: 1.4;
}
</style>

Atelier fil rouge : Utiliser TaskCard dans App.vue

Objectif

  • Créer le composant TaskCard.vue
  • L’importer dans App.vue
  • L’utiliser 3 fois avec des données statiques (titre + description)

Résultat final : App.vue mis à jour

<!-- src/App.vue -->
<template>
  <div class="app">
    <header>
      <h1>Mon gestionnaire de tâches</h1>
      <p>Chapitre 2 : Composants et props</p>
    </header>

    <main>
      <TaskCard 
        title="Tâche 1" 
        description="Créer le composant TaskCard" 
      />
      <TaskCard 
        title="Tâche 2" 
        description="Importer le composant dans App.vue" 
      />
      <TaskCard 
        title="Tâche 3" 
        description="Afficher 3 tâches avec des props" 
      />
    </main>

    <footer>
      <p>Vue.js — Formation Chapitre 2</p>
    </footer>
  </div>
</template>

<script setup>
import TaskCard from './components/TaskCard.vue'
</script>

<style scoped>
.app {
  font-family: Arial, sans-serif;
  max-width: 600px;
  margin: 2rem auto;
  padding: 2rem;
  border: 1px solid #ddd;
  border-radius: 8px;
  box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}

header h1 {
  color: #42b983;
  margin-bottom: 0.5rem;
}

header p {
  color: #666;
  font-size: 0.9rem;
}

main {
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

footer {
  margin-top: 2rem;
  text-align: center;
  font-size: 0.8rem;
  color: #999;
}
</style>

Explication du résultat

  • Le composant TaskCard est réutilisable : il peut être utilisé autant de fois que nécessaire.
  • Les données sont passées via props (title et description).
  • Le composant est isolé : son style est scoped, il n’affecte pas le reste de l’application.
  • Le rendu est visuellement cohérent : chaque tâche a un style identique, avec un effet au survol.

Testez le vous-même !

  • Créez le fichier src/components/TaskCard.vue avec le code ci-dessus.
  • Mettez à jour src/App.vue avec le code du résultat final.
  • Lancez le serveur de développement :
npm run dev
  • Ouvrez http://localhost:5173 → vous voyez 3 cartes de tâches avec titres et descriptions.

Prochain chapitre

Chapitre 3 : Réactivité et gestion d’état — Apprenez à gérer des tableaux de tâches avec ref() et computed(), et à les afficher dynamiquement avec v-for.

Tu as maintenant un composant réutilisable, bien structuré, avec des props typées et un style propre. C’est la base de toute application modulaire en Vue !

 

Formation Vue.js : Chapitre 1 – Découverte de Vue.js

Je vous propose de rentrer dans le vif du sujet avec le Chapitre 1 complet de la formation Vue.js, incluant les notions théoriques, les exemples de code, et le résultat final de l’atelier fil rouge.

Chapitre 1 : Découverte de Vue.js

L’objectif de ce premier chapitre est de comprendre les bases de Vue.js, créer un premier composant réactif, et mettre en place l’atelier fil rouge : une page d’accueil avec titre dynamique mis à jour en temps réel via un champ de saisie.

1. Qu’est-ce que Vue.js ?

Vue.js est un framework progressif pour construire des interfaces utilisateur. Il permet de créer des applications simples (comme un composant) ou complexes (Single Page Application, Progessif Web Application) en utilisant des composants réactifs.

2. Structure d’un composant Vue

Un composant Vue 3 (avec <script setup>) est structuré en 3 parties :

  • <template> : le HTML dynamique
  • <script setup> : la logique (réactivité, méthodes, etc.)
  • <style> : les styles (optionnel, avec scoped pour isoler les styles)

3. Réactivité avec ref()

Vue utilise ref() pour créer des variables réactives. Toute modification de ces variables met à jour automatiquement l’interface.

4. Directives de base

  • v-bind (ou :) : lie une propriété HTML à une variable
  • v-model : crée un binding bidirectionnel entre un champ et une variable
  • v-if : affiche ou cache un élément selon une condition
  • v-for : boucle sur une liste pour générer des éléments

Exemple de code : App.vue

<!-- App.vue -->
<template>
  <div class="container">
    <h1>{{ message }}</h1>
    <input 
      v-model="message" 
      placeholder="Éditez-moi !" 
      class="input-field"
    />
  </div>
</template>

<script setup>
import { ref } from 'vue'

// Variable réactive
const message = ref('Bonjour Vue 3 !')
</script>

<style scoped>
.container {
  padding: 2rem;
  text-align: center;
}

.input-field {
  width: 100%;
  max-width: 300px;
  padding: 0.5rem;
  font-size: 1rem;
  margin-top: 1rem;
  border: 1px solid #ccc;
  border-radius: 4px;
}

h1 {
  color: #42b983;
  font-size: 2rem;
}
</style>

Atelier fil rouge : Page d’accueil dynamique

Objectif

Créer une page où :

  • Un titre s’affiche (<h1>)
  • Un champ de saisie permet de modifier ce titre en temps réel
  • Le titre se met à jour automatiquement à chaque frappe

Résultat final

Voici le code complet de App.vue après réalisation de l’atelier :

<!-- App.vue -->
<template>
  <div class="app">
    <header>
      <h1>{{ pageTitle }}</h1>
      <p>Éditez le titre ci-dessous pour le voir changer en direct !</p>
    </header>

    <main>
      <input
        v-model="pageTitle"
        placeholder="Entrez un nouveau titre..."
        class="title-input"
        autofocus
      />
    </main>

    <footer>
      <p>Vue.js — Formation Chapitre 1</p>
    </footer>
  </div>
</template>

<script setup>
import { ref } from 'vue'

// Variable réactive pour le titre de la page
const pageTitle = ref('Bienvenue dans votre premier composant Vue !')
</script>

<style scoped>
.app {
  font-family: Arial, sans-serif;
  max-width: 600px;
  margin: 2rem auto;
  padding: 2rem;
  border: 1px solid #ddd;
  border-radius: 8px;
  box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}

header h1 {
  color: #42b983;
  margin-bottom: 0.5rem;
}

header p {
  color: #666;
  font-size: 0.9rem;
}

.title-input {
  width: 100%;
  padding: 0.75rem;
  font-size: 1.1rem;
  border: 2px solid #42b983;
  border-radius: 6px;
  outline: none;
  transition: border-color 0.2s;
}

.title-input:focus {
  border-color: #2ecc71;
}

footer {
  margin-top: 2rem;
  text-align: center;
  font-size: 0.8rem;
  color: #999;
}
</style>

Explication du résultat

  • pageTitle est une variable réactive créée avec ref().
  • v-model="pageTitle" lie le champ de saisie à cette variable → toute modification du champ met à jour pageTitle, et vice versa.
  • Le <h1> affiche la valeur de pageTitle → il se met à jour automatiquement.
  • Le style est simple mais clair, avec un focus sur l’expérience utilisateur.

Testez-le vous-même !

1. Créez un nouveau projet Vue avec Vite :

npm create vite@latest mon-projet-vue -- --template vue
cd mon-projet-vue
npm install
npm run dev

2. Remplacez le contenu de src/App.vue par le code ci-dessus.

3. Ouvrez http://localhost:5173 dans votre navigateur.

4. Tapez dans le champ → le titre change en temps réel 

Prochain chapitre

Chapitre 2 – Composants et props : Apprenez à créer des composants réutilisables et à les connecter entre eux.

Tu as maintenant ton premier composant Vue fonctionnel, réactif et stylé. C’est le socle de toutes les applications Vue !

Tu peux me demander de t’aider à ajouter des fonctionnalités (ex : bouton “Réinitialiser”, compteur de caractères, etc.) ou passer au chapitre suivant.

Formation Vue.js : Apprenez par la pratique étape par étape

Apprenez Vue.js en 11 étapes

Votre plan de formation complet pour construire une application Kanban professionnelle.

Je vous propose un plan de formation détaillé pour maîtriser Vue.js en partant des bases jusqu’à la construction d’une application complète Kanban (gestionnaire de tâches). Ce plan est structuré en chapitres progressifs, avec des notions théoriques, des exemples de code et un atelier fil rouge à réaliser au fur et à mesure.

Vous rêvez de maîtriser Vue.js, le framework moderne, léger et ultra-productif pour créer des interfaces utilisateur réactives ? Vous voulez passer de débutant à développeur capable de livrer une application complète, testée, déployée, et même avec du drag & drop et de la persistance locale ? Alors ce plan de formation est fait pour vous.

Pourquoi ce plan de formation ?

Beaucoup de tutoriels vous apprennent à afficher “Hello World”, puis s’arrêtent là. Ici, vous construisez une application réelle, étape par étape, en partant des bases jusqu’au déploiement en ligne. Pas de théorie inutile. Juste du code, des bonnes pratiques, et des fonctionnalités concrètes.

Le projet final ? Un gestionnaire de tâches Kanban — avec colonnes, drag & drop, persistance, tests, et déploiement. Parfait pour votre portfolio, votre CV, ou votre prochain projet professionnel.

Plan de formation Vue.js — Niveau Débutant à Confirmé

  • Prérequis : Connaissances de base en HTML, CSS, JavaScript (ES6+).
  • Outils recommandés : Node.js, VS Code, Vite (ou Vue CLI), navigateur (je vous conseille Firefox ou Brave).

Le parcours en 11 chapitres

Chapitre 1 : Découverte de Vue.js

Créez votre premier composant réactif. Comprenez la structure d’un composant Vue 3, les directives de base (v-model, v-for) et la réactivité avec ref().

Notions à apprendre :

  • Qu’est-ce que Vue.js ? (framework progressif, composants, réactivité)
  • Différences avec React / Angular
  • Installation via Vite (recommandé) ou CDN
  • Structure d’un composant Vue (template, script, style)
  • v-bind, v-model, v-if, v-for

Exemple de code :

<!-- App.vue -->
<template>
  <div>
    <h1>{{ message }}</h1>
    <input v-model="message" placeholder="Éditez-moi !" />
  </div>
</template>

<script setup>
import { ref } from 'vue'
const message = ref('Bonjour Vue 3 !')
</script>

Atelier fil rouge :

Créer une page d’accueil avec un titre dynamique et un champ de saisie qui met à jour le titre en temps réel.

Découvrez le Chapitre 1 – Découverte de Vue.js

Chapitre 2 : Composants et props

Apprenez à créer des composants réutilisables comme TaskCard.vue, et à les alimenter avec des données via des props.

Notions à apprendre :

  • Création de composants réutilisables
  • Props (passage de données parent → enfant)
  • Événements personnalisés (emit)
  • Communication entre composants
  • Slots (contenu dynamique)

Exemple de code :

<!-- TaskCard.vue -->
<template>
  <div class="task">
    <h3>{{ title }}</h3>
    <p>{{ description }}</p>
  </div>
</template>

<script setup>
defineProps({
  title: String,
  description: String
})
</script>

Atelier fil rouge :

Créer un composant TaskCard qui affiche une tâche avec titre et description. Utiliser ce composant dans App.vue avec des données statiques.

Découvrez le Chapitre 2 – Composants et props

Chapitre 3 : Réactivité et gestion d’état

Gérez un tableau de tâches dynamique avec ref() et computed(). Affichez le nombre de tâches terminées en temps réel.

Notions à apprendre :

  • ref() et reactive()
  • watch() et computed()
  • Gestion des tableaux et objets réactifs
  • Mutation vs réactivité (éviter les mutations directes)

Exemple de code :

import { ref, computed } from 'vue'

const tasks = ref([
  { id: 1, title: 'Tâche 1', status: 'todo' },
  { id: 2, title: 'Tâche 2', status: 'done' }
])

const doneTasks = computed(() => tasks.value.filter(t => t.status === 'done'))

Atelier fil rouge :

Ajouter un tableau de tâches dans App.vue. Afficher le nombre de tâches terminées via un computed.

Découvrez le Chapitre 3 – Réactivité et gestion d’état

Chapitre 4 : Gestion des événements et formulaires

Ajoutez un formulaire pour créer une nouvelle tâche, avec validation et mise à jour du tableau.

Notions à apprendre :

  • Gestion des clics, saisies, soumissions
  • Validation de formulaires (vérification basique)
  • v-on / @ (syntaxe raccourcie)
  • Gestion des erreurs

Exemple de code :

<template>
  <form @submit.prevent="addTask">
    <input v-model="newTaskTitle" placeholder="Titre de la tâche" required />
    <button>Ajouter</button>
  </form>
</template>

<script setup>
import { ref } from 'vue'

const newTaskTitle = ref('')
const tasks = ref([])

function addTask() {
  if (newTaskTitle.value.trim()) {
    tasks.value.push({
      id: Date.now(),
      title: newTaskTitle.value,
      status: 'todo'
    })
    newTaskTitle.value = ''
  }
}
</script>

Atelier fil rouge :

Ajouter un formulaire pour créer une nouvelle tâche. Valider que le titre n’est pas vide

Chapitre 5 : Router (navigation entre pages)

Installez vue-router et créez une page d’accueil et une page de détail de tâche avec paramètres d’URL.

Notions à apprendre :

  • Installation de vue-router
  • Définition des routes
  • Navigation avec <router-link>
  • Paramètres de route (:id)
  • Navigation programmatique (router.push)

Exemple de code :

// router/index.js
import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'
import TaskDetail from '../views/TaskDetail.vue'

const routes = [
  { path: '/', component: Home },
  { path: '/task/:id', component: TaskDetail }
]

const router = createRouter({ history: createWebHistory(), routes })
export default router

Atelier fil rouge :

Créer une page de détail de tâche accessible via /task/:id. Afficher les détails de la tâche sélectionnée.

Chapitre 6 : Pinia (gestion d’état centralisée)

Migrez la gestion des tâches vers un store Pinia. Partagez les données entre composants et pages sans effort.

Notions à apprendre :

  • Installation de pinia
  • Création d’un store
  • Actions, getters, mutations
  • Utilisation dans les composants
  • Persistance locale (optionnel)

Exemple de code :

// stores/tasks.js
import { defineStore } from 'pinia'

export const useTaskStore = defineStore('tasks', {
  state: () => ({
    tasks: []
  }),
  actions: {
    addTask(title) {
      this.tasks.push({ id: Date.now(), title, status: 'todo' })
    }
  },
  getters: {
    doneTasks: state => state.tasks.filter(t => t.status === 'done')
  }
})

Atelier fil rouge :

Migrer la gestion des tâches vers Pinia. Utiliser le store dans les composants.

Chapitre 7 : Styling et composants UI

Ajoutez des classes dynamiques, des animations avec TransitionGroup, et un bouton “Supprimer” dans chaque tâche.

Notions à apprendre :

  • Classes dynamiques (:class, :style)
  • Bibliothèques UI : Tailwind CSS, Vuetify, Element Plus (optionnel)
  • Composants réutilisables avec slots
  • Animation avec Transition et TransitionGroup

Exemple de code :

<template>
  <div :class="{ 'task-done': task.status === 'done' }">
    {{ task.title }}
  </div>
</template>

<style scoped>
.task-done {
  text-decoration: line-through;
  color: #888;
}
</style>

Atelier fil rouge :

Ajouter des styles pour distinguer les tâches « à faire », « en cours », « terminées ». Utiliser des couleurs ou icônes.

Chapitre 8 : Kanban : Structure et drag & drop

Créez les 3 colonnes (todo, in progress, done) et permettez le déplacement des tâches avec vuedraggable.

Notions à apprendre :

  • Structure Kanban : colonnes (todo, in progress, done)
  • Drag & drop natif ou avec vuedraggable
  • Gestion des états de colonnes
  • Mise à jour de l’état lors du déplacement

Exemple de code (avec vuedraggable) :

<template>
  <div class="kanban">
    <div v-for="column in columns" :key="column.id" class="column">
      <h3>{{ column.title }}</h3>
      <draggable v-model="column.tasks" item-key="id" group="tasks">
        <template #item="{ element }">
          <TaskCard :title="element.title" />
        </template>
      </draggable>
    </div>
  </div>
</template>

<script setup>
import draggable from 'vuedraggable'
import TaskCard from '@/components/TaskCard.vue'

const columns = ref([
  { id: 'todo', title: 'À faire', tasks: [] },
  { id: 'inprogress', title: 'En cours', tasks: [] },
  { id: 'done', title: 'Terminé', tasks: [] }
])
</script>

Atelier fil rouge :

Créer les 3 colonnes Kanban. Permettre de déplacer les tâches entre colonnes via drag & drop.

Chapitre 9 : Persistance et stockage local

Sauvegardez les tâches dans localStorage et chargez-les au démarrage. Vos données persistent même après un rechargement.

Notions à apprendre :

  • localStorage / sessionStorage
  • Sauvegarde et chargement des tâches
  • Sérialisation/désérialisation JSON
  • Gestion des erreurs

Exemple de code :

// Dans le store Pinia
actions: {
  loadFromLocalStorage() {
    const saved = localStorage.getItem('tasks')
    if (saved) this.tasks = JSON.parse(saved)
  },
  saveToLocalStorage() {
    localStorage.setItem('tasks', JSON.stringify(this.tasks))
  }
}

Atelier fil rouge :

Sauvegarder les tâches dans localStorage. Charger les données au démarrage de l’application.

Chapitre 10 : Tests unitaires (optionnel)

Écrivez des tests avec Vitest pour valider le comportement de vos composants et stores. Une bonne pratique professionnelle.

Notions à apprendre :

  • Tests avec Vitest
  • Tests de composants avec @vue/test-utils
  • Tests E2E avec Cypress ou Playwright

Exemple de test :

// tests/unit/TaskCard.spec.js
import { mount } from '@vue/test-utils'
import TaskCard from '@/components/TaskCard.vue'

test('affiche le titre', () => {
  const wrapper = mount(TaskCard, {
    props: { title: 'Test', description: 'Description' }
  })
  expect(wrapper.text()).toContain('Test')
})

Atelier fil rouge :

Écrire un test unitaire pour TaskCard.vue qui vérifie que le titre est affiché.

Chapitre 11 : Déploiement

Générez un build de production et déployez votre application sur Netlify. Partagez le lien avec le monde entier.

Notions à apprendre :

  • Build de production avec vite build
  • Déploiement sur Netlify, Vercel, GitHub Pages
  • Configuration de vite.config.js
  • Optimisation (code splitting, minification)

Exemple de commande :

npm run build
npm run preview # pour tester en local

Atelier fil rouge :

Générer un build de production et le déployer sur Netlify ou Vercel.

Projet final : Application Kanban complète

Fonctionnalités attendues :

✅ Ajout/modification/suppression de tâches
✅ Drag & drop entre colonnes
✅ Sauvegarde locale
✅ Interface responsive
✅ Navigation avec router
✅ Gestion d’état avec Pinia
✅ Tests unitaires (optionnel)
✅ Déploiement en ligne

Ce que vous gagnez :

  • Une application complète prête à être utilisée ou présentée dans votre portfolio.
  • Des compétences réutilisables : composants, réactivité, router, Pinia, drag & drop, tests, déploiement.
  • Une architecture professionnelle : séparation des responsabilités, gestion d’état centralisée, tests, optimisation.
  • Un projet concret à montrer à vos futurs employeurs ou clients.

Pour qui est-ce ?

  • Débutants en Vue.js qui veulent apprendre de A à Z.
  • Développeurs qui connaissent déjà les bases et veulent construire une application réelle.
  • Étudiants, freelances, ou professionnels en reconversion.
  • Tous ceux qui veulent apprendre en faisant, pas en lisant.

À vous de jouer !

Vous avez tout ce qu’il faut pour démarrer. Le plan est structuré, les exemples de code sont complets, et chaque chapitre s’appuie sur le précédent.

Vous n’avez pas besoin d’être un expert pour commencer. Vous avez juste besoin de commencer.
Commencez dès aujourd’hui : créez un nouveau projet Vue avec Vite, suivez le chapitre 1, et construisez votre première application.

Vous n’êtes qu’à 11 étapes de devenir un développeur Vue.js capable de livrer des applications réelles.

Partagez ce plan avec un ami qui veut apprendre Vue.js

Angular et Pokémon : créez votre Pokédex complet

À l’heure où Angular 19 vient de sortir, je te propose de découvrir ses capacités à travers un projet ludique et pratique. Cette nouvelle version du framework apporte son lot d’améliorations significatives : des performances nettement optimisées grâce au nouveau compilateur Ivy, un support amélioré pour les signaux qui révolutionne la gestion d’état, et l’intégration native de l’hydratation qui accélère considérablement le rendu des applications. La documentation a également été repensée pour faciliter l’apprentissage des débutants.

Dans ce tutoriel, je vais explorer ces fonctionnalités avec toi en créant une application Pokédex complète qui s’appuie sur l’API Pokémon publique. Que tu sois un développeur chevronné cherchant à te familiariser avec Angular 19 ou un novice souhaitant apprendre le framework depuis zéro, ce projet te permettra de comprendre comment structurer ton application selon le modèle MVC tout en tirant parti des dernières innovations d’Angular.

Créer une application Pokédex complète qui s'appuie sur l'API Pokémon.

Créer une application Pokédex complète qui s’appuie sur l’API Pokémon.


Lire aussi : Angular : Comment créer votre premier projet ?


1. Prérequis

  • Installez Node.js depuis nodejs.org
  • Installez Angular CLI en ouvrant un terminal et en tapant :
npm install -g @angular/cli

2. Création du projet

ng new pokemon-app
cd pokemon-app
  • Répondez « yes » pour le routing
  • Choisissez CSS comme format de style

3. Structure MVC (Modèle-Vue-Contrôleur)

  • Modèle : Le fichier pokemon.model.ts définit l’interface Pokemon avec toutes ses propriétés
  • Vue : Les fichiers .html et .css dans les composants
  • Contrôleur : Les fichiers .component.ts et le service

4. Les composants principaux

a. Service (pokemon.service.ts)

  • Crée avec : ng generate service services/pokemon
  • Gère les appels API vers pokeapi.co
  • Utilise HttpClient pour les requêtes HTTP
  • Contient deux méthodes principales : getPokemonList et getPokemonDetail

b. Liste des Pokémon (pokemon-list)

  • Crée avec : ng generate component components/pokemon-list
  • Affiche la grille des Pokémon
  • Utilise le service pour charger les données
  • Gère le chargement et les erreurs

c. Détail d’un Pokemon (pokemon-detail)

  • Créé avec : ng generate component components/pokemon-detail
  • Affiche les informations sur un Pokémon spécifique

5. Installation et démarrage

npm install
ng serve

Visitez http://localhost:4200 dans votre navigateur


Retrouves le code sur mon GitHub : https://github.com/claudebueno/pokemon-app


5. Structure du projet Pokédex

La structure de notre projet suit les bonnes pratiques Angular tout en respectant le modèle MVC (Modèle-Vue-Contrôleur). Voici comment les fichiers sont organisés :

# Structure du projet Pokédex Angular

```
pokemon-app/
├── src/
│   ├── app/
│   │   ├── models/
│   │   │   └── pokemon.model.ts         // Interface définissant la structure des données Pokémon
│   │   │
│   │   ├── services/
│   │   │   └── pokemon.service.ts       // Service gérant les appels API
│   │   │
│   │   ├── components/
│   │   │   ├── pokemon-list/            // Composant liste des Pokémon
│   │   │   │   ├── pokemon-list.component.ts
│   │   │   │   ├── pokemon-list.component.html
│   │   │   │   └── pokemon-list.component.css
│   │   │   │
│   │   │   └── pokemon-detail/          // Composant détail d'un Pokémon (optionnel)
│   │   │       ├── pokemon-detail.component.ts
│   │   │       ├── pokemon-detail.component.html
│   │   │       └── pokemon-detail.component.css
│   │   │
│   │   ├── app.module.ts                // Module principal de l'application
│   │   ├── app.component.ts             // Composant racine
│   │   ├── app.component.html           // Template du composant racine
│   │   └── app.component.css            // Styles du composant racine
│   │
│   ├── assets/                          // Ressources statiques (images, icônes)
│   ├── environments/                    // Configuration des environnements
│   ├── index.html                       // Page HTML principale
│   └── styles.css                       // Styles globaux
│
├── angular.json                         // Configuration Angular
├── package.json                         // Dépendances et scripts
└── tsconfig.json                        // Configuration TypeScript
```

Répertoire « models »

Ce dossier contient nos interfaces TypeScript qui définissent la structure des données. Le fichier pokemon.model.ts constitue notre Modèle dans le pattern MVC. Il définit précisément toutes les propriétés d’un Pokémon (id, nom, types, sprites, etc.), ce qui nous permet de bénéficier du typage fort et de l’autocomplétion.

Répertoire « services »

Les services gèrent la logique métier et les appels aux API externes. Notre pokemon.service.ts encapsule toutes les requêtes HTTP vers l’API Pokémon et transforme les données brutes en objets exploitables par notre application. Ce service suit le principe d’injection de dépendances d’Angular et peut être facilement utilisé dans n’importe quel composant.

Répertoire « components »

Ce dossier regroupe tous nos composants, chacun ayant sa propre structure avec trois fichiers (TypeScript, HTML, CSS) :

1.pokemon-list :

affiche la grille des Pokémon disponibles

  • Le fichier .ts agit comme le Contrôleur
  • Le fichier .html constitue la Vue
  • Le fichier .css gère les styles spécifiques au composant

2.pokemon-detail :

permet de voir plus d’informations sur un Pokémon spécifique, suivant la même structure.

Fichiers racine de l’application

  • app.module.ts : déclare tous les composants et importe les modules nécessaires
  • app.component.ts/html/css : composant racine qui sert de conteneur principal à l’application

Cette organisation modulaire permet une séparation claire des responsabilités, facilite la maintenance et rend le code plus évolutif. Tu pourras facilement ajouter de nouveaux composants ou fonctionnalités sans impacter le reste de l’application.

7. Fonctionnement du code

a. Le Modèle (pokemon.model.ts)

  • Définit la structure des données Pokémon
  • Permet la validation de type TypeScript

b. Le Service (pokemon.service.ts)

  • Injecté dans les composants qui en ont besoin
  • Utilise HttpClient pour les requêtes API
  • Retourne des Observables (programmation réactive)

c. Le Composant Liste (pokemon-list.component.ts)

  • Initialise le chargement des données au démarrage (ngOnInit)
  • Gère l’état de chargement et les erreurs
  • Transforme les données reçues pour l’affichage

d. La Vue (pokemon-list.component.html)

  • Utilise les directives Angular (*ngIf, *ngFor)
  • Affiche les données de manière responsive
  • Gère différents états (chargement, erreur, données)

7. Fonctionnalités principales

  • Affichage en grille responsive
  • Chargement asynchrone des données
  • Gestion des erreurs
  • Affichage des types de Pokémon
  • Images et noms formatés

8. Points importants à comprendre

  • Les Observables pour la gestion des données asynchrones
  • L’injection de dépendances pour le service
  • Les directives structurelles (*ngIf, *ngFor)
  • Le data binding avec [] et {{}}
  • La gestion des états (chargement, erreur)

Tu as maintenant toutes les clés en main pour développer ta propre application Pokédex avec Angular 19. À travers ce projet, tu as pu explorer les fondamentaux du framework tout en découvrant ses nouvelles fonctionnalités impressionnantes. L’architecture MVC, les services, les composants et la gestion des données asynchrones n’ont plus de secrets pour toi.

N’hésite pas à enrichir cette base solide en ajoutant de nouvelles fonctionnalités comme la pagination, la recherche ou des détails sur chaque Pokémon. Angular 19 offre un potentiel illimité pour tes projets, et cette application Pokédex n’est que le début de ton aventure de développement. Alors, à toi de jouer !

 

KISS : La méthode ultime pour simplifier le développement logiciel

A la découverte du principe de KISS

Le principe de KISS dans le développement d’applications signifie “Keep It Simple, Stupid” (ou parfois interprété comme “Keep It Simple and Straightforward”). C’est un principe de conception qui encourage la simplicité et la clarté dans le développement de logiciels, en évitant la complexité inutile.

Voici ses principales caractéristiques :

1. Simplicité avant tout

L’idée principale est que les systèmes simples sont plus faciles à comprendre, à maintenir et à améliorer que les systèmes complexes.

Un code simple est :
Facile à lire : Les développeurs, même ceux qui n’ont pas écrit le code, peuvent le comprendre rapidement.
Facile à tester : Moins de complexité signifie moins de risques d’erreurs.
Facile à modifier : Si le code est simple, il est plus facile d’ajouter de nouvelles fonctionnalités ou de corriger des bugs.

2. Éviter le surdesign

Le principe KISS incite à se concentrer sur les besoins réels au lieu d’anticiper des fonctionnalités ou des cas d’usage qui pourraient ne jamais arriver.

Par exemple :

  • Ne pas ajouter de couches supplémentaires ou d’abstractions si elles ne sont pas strictement nécessaires.
  • Éviter les solutions trop sophistiquées quand une solution simple répond au besoin.

3. Pourquoi c’est important ?

Un code trop complexe :

  • Augmente les risques d’erreurs.
  • Rend le projet plus coûteux en temps et en ressources.
  • Décourage les nouveaux développeurs qui doivent s’intégrer au projet.

4. Application du KISS en pratique

Écrire des fonctions courtes : Une fonction doit faire une seule chose et le faire bien.
Utiliser des noms explicites : Les noms de variables, de fonctions, ou de classes doivent expliquer leur rôle sans ambiguïté.
Favoriser la simplicité algorithmique : Choisir l’algorithme ou la solution qui répond directement au besoin sans complexité excessive.
Réutiliser des solutions existantes : Utiliser des bibliothèques fiables plutôt que de réinventer la roue.

5. Lien avec d’autres principes

Le principe KISS est souvent associé à d’autres concepts :

  • DRY (Don’t Repeat Yourself) : Éviter la redondance en factorisant le code.
  • YAGNI (You Aren’t Gonna Need It) : Ne pas coder des fonctionnalités inutiles pour le moment.

En résumé, le principe KISS encourage les développeurs à rester pragmatiques et à privilégier la simplicité, ce qui améliore la qualité et la longévité des applications.

Comparatif de 2 exemples de code avant/après

Voici deux exemples pour illustrer comment appliquer le principe KISS en Java en simplifiant un code complexe ou inutilement abstrait.

Exemple 1 : Calcul d’une somme de nombres dans un tableau

Avant (complexité inutile)

public class ArraySumCalculator {

    public int calculateSum(int[] numbers) {
        if (numbers == null || numbers.length == 0) {
            throw new IllegalArgumentException("Array cannot be null or empty");
        }
        int sum = performComplexSumCalculation(numbers);
        return sum;
    }

    private int performComplexSumCalculation(int[] numbers) {
        int total = 0;
        for (int num : numbers) {
            total = addNumbers(total, num);
        }
        return total;
    }

    private int addNumbers(int a, int b) {
        return a + b;
    }
}

Problème : Trop de méthodes inutiles pour une tâche simple.
Complexité non nécessaire avec performComplexSumCalculation et addNumbers.

Après (application du principe KISS)

public class ArraySumCalculator {

    public int calculateSum(int[] numbers) {
        int sum = 0;
        for (int num : numbers) {
            sum += num;
        }
        return sum;
    }
}

Le code est plus lisible et maintenable.
La logique est claire et ne contient pas de couches inutiles.

Exemple 2 : Vérification qu’une chaîne est un palindrome

Avant (abstraction et optimisation prématurée)

public class PalindromeChecker {

    public boolean isPalindrome(String input) {
        if (input == null) {
            return false;
        }
        String sanitizedInput = sanitizeString(input);
        return checkPalindromeWithTwoPointers(sanitizedInput);
    }

    private String sanitizeString(String input) {
        return input.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
    }

    private boolean checkPalindromeWithTwoPointers(String input) {
        int left = 0;
        int right = input.length() - 1;
        while (left < right) {
            if (input.charAt(left) != input.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

Problème : Trop de méthodes inutiles pour une tâche simple.

Complexité non nécessaire avec performComplexSumCalculation et addNumbers.

Après (application du principe KISS)

public class PalindromeChecker {

    public boolean isPalindrome(String input) {
        if (input == null) {
            return false;
        }
        String sanitizedInput = input.replaceAll("[^a-zA-Z0-9]", "").toLowerCase();
        String reversedInput = new StringBuilder(sanitizedInput).reverse().toString();
        return sanitizedInput.equals(reversedInput);
    }
}

Simplification de la logique en utilisant des outils standard comme StringBuilder pour inverser la chaîne.

Le code est concis, tout en étant lisible et performant.

Les avantages de KISS en bref

L’application du principe KISS dans ces exemples :

  1. Supprime les abstractions inutiles.
  2. Utilise des solutions simples et directes.
  3. Favorise la lisibilité et la maintenance.

 

Introduction à JavaScript

JavaScript (JS) est un langage de programmation compilé, léger, multiplateforme et interprété, également connu sous le nom de langage de script pour les pages Web. Il est bien connu pour le développement de pages Web, mais de nombreux environnements sans navigateur l’utilisent également. JavaScript peut être utilisé pour les développements côté client et côté serveur. JavaScript est un langage à la fois impératif et déclaratif. JavaScript contient une bibliothèque standard d’objets, comme Array, Date et Math, et un ensemble d’éléments de langage de base comme les opérateurs, les structures de contrôle et les instructions.

  • Côté client : il fournit des objets pour contrôler un navigateur et son Document Object Model (DOM). Comme si les extensions côté client permettaient à une application de placer des éléments sur un formulaire HTML et de répondre aux événements de l’utilisateur tels que les clics de souris, la saisie de formulaires et la navigation dans la page. Les bibliothèques utiles pour le côté client sont AngularJS, ReactJS, VueJS et bien d’autres.
  • Côté serveur : il fournit des objets pertinents pour l’exécution de JavaScript sur un serveur. Par exemple, les extensions côté serveur permettent à une application de communiquer avec une base de données et d’assurer la continuité des informations d’une invocation à l’autre de l’application, ou d’effectuer des manipulations de fichiers sur un serveur. Le framework utile qui est le plus célèbre de nos jours est node.js.
  • Langage impératif – Dans ce type de langage, nous nous préoccupons surtout de la manière dont les choses doivent être faites. Il contrôle simplement le flux de calcul. L’approche de la programmation procédurale, l’approche orientée objet en font partie, comme l’attente asynchrone, où l’on pense à ce qui doit être fait après l’appel asynchrone.
  • Programmation déclarative – Dans ce type de langage, on se préoccupe de la manière dont on va procéder, essentiellement dans le cas d’un calcul logique. Ici, l’objectif principal est de décrire le résultat souhaité sans dictée directe sur la façon de l’obtenir comme la fonction flèche faire.

JavaScript peut être ajouté à votre fichier HTML de deux façons :

  • JS interne : Nous pouvons ajouter du JavaScript directement à notre fichier HTML en écrivant le code à l’intérieur de la balise <script>. La balise <script> peut être placée à l’intérieur de la balise <head> ou <body> selon les besoins.
  • External JS : Nous pouvons écrire le code JavaScript dans un autre fichier ayant une extension .js et ensuite lier ce fichier à l’intérieur de la balise <head> du fichier HTML dans lequel nous voulons ajouter ce code.

Syntaxe :
<script>
// Code JavaScript
</script>
 Exemple :

<!DOCTYPE html> 
<html lang="en"> 
  <head> 
    <title> 
    Exemple de page HTML contenant du JavaScript 
    </title> 
  </head> 
  <body> 
    <!-- JavaScript peut également être incorporé dans la section head --> 
    <script> 
      console.log("Bienvenue Claude"); 
    </script> 
  </body> 
</html>

La sortie s’affiche sur la console : Bienvenue Claude

Histoire de JavaScript

JavaScript a été créé en 1995 par Brendan Eich alors qu’il était ingénieur chez Netscape. Il devait à l’origine s’appeler LiveScript mais a été renommé. Contrairement à la plupart des langages de programmation, le langage JavaScript n’a pas de concept d’entrée ou de sortie. Il est conçu pour s’exécuter comme un langage de script dans un environnement hôte, et c’est à l’environnement hôte de fournir des mécanismes de communication avec le monde extérieur. L’environnement hôte le plus courant est le navigateur.

Caractéristiques de JavaScript

Selon une enquête récente menée par Stack Overflow, JavaScript est le langage le plus populaire sur terre.
Avec les progrès de la technologie des navigateurs et le passage de JavaScript au serveur avec Node.js et d’autres frameworks, JavaScript est capable de beaucoup plus. Voici quelques exemples de ce que nous pouvons faire avec JavaScript :

  • JavaScript a été créé en premier lieu pour la manipulation du DOM. Les sites Web antérieurs étaient principalement statiques, après la création de JS, des sites Web dynamiques ont été créés.
  • Les fonctions en JS sont des objets. Elles peuvent avoir des propriétés et des méthodes tout comme un autre objet. Elles peuvent être passées comme arguments dans d’autres fonctions.
  • Elles peuvent gérer la date et l’heure.
  • Effectue la validation de formulaire bien que les formulaires soient créés en HTML.
  • Aucun compilateur n’est nécessaire.

Applications de JavaScript

  • Développement Web : Ajouter de l’interactivité et du comportement aux sites statiques JavaScript a été inventé pour faire cela en 1995. En utilisant AngularJS, cela peut être réalisé si facilement.
  • Applications Web : Avec la technologie, les navigateurs se sont améliorés à tel point qu’un langage était nécessaire pour créer des applications web robustes. Lorsque nous explorons une carte dans Google Maps, il nous suffit de cliquer et de faire glisser la souris. Toutes les vues détaillées sont à portée de clic, et cela n’est possible que grâce à JavaScript. Il utilise des interfaces de programmation d’applications (API) qui apportent une puissance supplémentaire au code. Electron et React sont utiles dans ce domaine.
  • Applications serveur : Avec l’aide de Node.js, JavaScript est passé du client au serveur et node.js est le plus puissant du côté serveur.
  • Jeux : Non seulement dans les sites Web, mais JavaScript aide également à créer des jeux pour les loisirs. La combinaison de JavaScript et de HTML 5 rend JavaScript populaire dans le développement de jeux également. Il fournit la bibliothèque EaseJS qui offre des solutions pour travailler avec des graphiques riches.
  • Les smartwatches : JavaScript est utilisé dans tous les appareils et applications possibles. Il fournit une bibliothèque, PebbleJS, qui est utilisée dans les applications de montres intelligentes. Ce cadre fonctionne pour les applications qui nécessitent l’internet pour leur fonctionnement.
  • Art : Les artistes et les concepteurs peuvent créer ce qu’ils veulent en utilisant JavaScript pour dessiner sur la toile HTML 5, et rendre le son plus efficace peut également être utilisé la bibliothèque p5.js.
  • Apprentissage automatique : Cette bibliothèque JavaScript ml5.js peut être utilisée dans le développement web en utilisant l’apprentissage automatique.
  • Applications mobiles : JavaScript peut également être utilisé pour construire une application dans des contextes autres que le web. Les caractéristiques et les utilisations de JavaScript en font un outil puissant pour la création d’applications mobiles. Il s’agit d’un cadre permettant de créer des applications web et mobiles à l’aide de JavaScript. En utilisant React Native, nous pouvons construire des applications mobiles pour différents systèmes d’exploitation. Nous n’avons pas besoin d’écrire du code pour différents systèmes. Ecrivez une fois et utilisez-le partout !

Limites de JavaScript

  • Risques de sécurité : JavaScript peut être utilisé pour récupérer des données à l’aide d’AJAX ou en manipulant des balises qui chargent des données. Ces attaques sont appelées attaques de script intersite. Ils injectent JS qui ne fait pas partie du site dans le navigateur du visiteur récupérant ainsi les détails.
  • Performances : JavaScript n’offre pas le même niveau de performances que celui offert par de nombreux langages traditionnels, car un programme complexe écrit en JavaScript serait relativement lent. Mais comme JavaScript est utilisé pour effectuer des tâches simples dans un navigateur, les performances ne sont pas considérées comme une grande restriction à son utilisation.
  • Complexité : Pour maîtriser un langage de script, les programmeurs doivent avoir une connaissance approfondie de tous les concepts de programmation, des objets du langage de base, des objets côté client et côté serveur, sinon il leur serait difficile d’écrire des scripts avancés en utilisant JavaScript.
  • Faibles fonctions de gestion des erreurs et de vérification des types : il s’agit d’un langage faiblement typé car il n’est pas nécessaire de spécifier le type de données de la variable. Ainsi, la vérification des types erronés n’est pas effectuée par la compilation.

JavaScript est surtout connu pour le développement de pages Web, mais il est également utilisé dans une variété d’environnements autres que les navigateurs. Vous pouvez apprendre JavaScript à partir de zéro en suivant mes billets de blog au sujet de JavaScript 😉

 

Comment installer Angular 13 – Tutoriel

Récemment, la version stable d’Angular 13 est sortie ! Dans ce tutoriel, vous allez apprendre à installer Angular 13 sur votre machine, étape par étape, à partir du niveau débutant.

Heureusement, si vous avez déjà de l’expérience avec Angular 10, 11 ou 12, le processus de démarrage d’un nouveau projet Angular 13 est à peu près le même.

Cependant, si vous n’avez aucune expérience préalable avec Angular, ne vous inquiétez pas, l’installation d’Angular 13 est un jeu d’enfant.

Alors, c’est parti…

Prérequis

Vous allez avoir besoin de quelques éléments avant de commencer :

Remarque : Angular 13 nécessite Node.js version 16.x.

Node.js

Node Package Manager (npm)

Pour vérifier si vous avez installé ces deux éléments, rendez-vous sur votre ligne de commande ou votre Terminal et tapez :

node -v
npm -v

Si vous n’avez pas installé Node.js sur votre machine, allez simplement sur nodejs.org et téléchargez la dernière version stable (LTS : Long Terme Support, version stable bénéficiant de support sur une plus longue durée qu’une version standard) ou vous pouvez également utiliser la version actuelle et l’installer sur votre machine.

Installer Node JS en version LTS

Étape 1 : Installation d’Angular 13 par le CLI

L’interface CLI (Command Line Interface) d’Angular est le moyen le plus rapide et le plus facile de démarrer un projet Angular 13.

Nous pouvons utiliser Angular CLI pour créer de nouveaux projets, générer du code d’application et du code de bibliothèque, et aussi développer des tâches telles que la génération de composants, la création de bundle d’application, le déploiement, etc…

Nous allons utiliser npm pour installer le CLI Angular globalement à travers la commande suivante :

npm install -g @angular/cli

Une fois installé, vous pouvez accéder à l’outil CLI en tapant ng.

Pour vérifier la version de votre CLI Angular, tapez :

ng -version

angular

Il montrera la version du CLI actuellement installé. Super maintenant nous avons installé le CLI et il est prêt à être utilisé avec Angular.

Étape 2 : Créer un projet vierge dans Angular 13 avec CLI

Maintenant, allez dans le répertoire où vous voulez placer le projet avec CLI et ensuite tapez :

ng new

Il vous demandera des informations sur les fonctionnalités à inclure dans le projet d’application initial. Acceptez les valeurs par défaut en appuyant sur la touche Entrée.

Cela prendra un certain temps, une fois l’installation terminée, allez dans le répertoire du projet et tapez :

ng -v

Il retournera la version actuelle d’Angular que nous avons installée et d’autres informations.

Étape 3 : Lancer l’application

Nous avons maintenant installé Angular 13 et vous pouvez exécuter le projet dans le navigateur en tapant :

ng serve

Et c’est tout ! Maintenant, allez dans votre navigateur et tapez « http://localhost:4200 » et vous serez en mesure d’afficher l’écran suivant.

angular

Si vous rencontrez des difficultés lors de la création d’un projet, essayez de vider le cache en utilisant la commande suivante et réinstallez ensuite Angular CLI

npm cache clean -force

puis exécutez

npm install -g @angular/cli@latest

A lire également,

Merci de votre lecture.

Faites-moi savoir si vous rencontrez des difficultés, n’hésitez pas à commenter ci-dessous j’aime vous aider. Si vous avez une suggestion de nouvel article ou tutoriel alors exprimez-vous en commentant.

N’oubliez pas de partager ce tutoriel avec vos amis sur Facebook et Twitter.

 


Crédit photo :
ThisIsEngineering sur Pexels

Angular : Comment créer des graphiques dynamiques Highcharts ?

Avec ce tutoriel, je vais vous montrer comment utiliser Angular et Highcharts pour créer une simple page web qui génère un graphique. Vous pouvez utiliser cette méthode pour vos projets Angular de tableaux de bord ou tout autre applications faisant appel à des graphiques pour visualiser des données.

Dans un précédent billet, je vous avais présenter comment créer votre premier projet Angular. Nous allons utiliser la même méthode en passant par la ligne de commande. Je vous invite à consulter mon précédent billet pour vous assurer que vous avez bien les prérequis d’installer sur votre machine (npm et node).

0. Cas d’usage

Dans le cadre d’un projet permettant de présenter des indicateurs de suivi de pilotage d’activité, je cherchais à créer un tableau de bord avec des visuels permettant de suivre les évolutions de plusieurs indicateurs pour animer des instances COPRO et COPIL. J’ai testé plusieurs bibliothèques permettant de créer des graphes et mon choix s’est arrêté sur Highcharts.

Après avoir expérimenté une première version de ce tableau de bord en version HTML, CSS et JavaScript, j’ai tenté d’implémenter Highcharts avec Angular. Voici le partage des étapes que j’ai utilisé pour afficher un graphique avec Angular dans une page web.

1. Créer le projet Angular

Rendez-vous dans le dossier dans lequel vous souhaitez créer votre projet pour configurer l’environnement de développement. D’abord, nous installons l’Angular CLI pour utilise la ligne de commande :

sudo npm install -g @angular/cli

Ensuite nous créons le projet Angular appelé dans mon exemple « angular-highcharts » :

ng new angular-highcharts

Une fois le projet créé, nous entrons dans le dossier contenant le projet :

cd angular-highcharts/

Pour tester le projet, nous allons lancer le serveur avec l’option permettant de lancer le navigateur web par défaut sur votre machine pour visualiser le projet :

ng serve --open

Le serveur web local s’ouvre sur le port 4200 et bingo votre projet apparait sous forme d’une page de test par défaut :

Angular

2. Adapter le projet Angular

Dans le cadre de ce tutoriel, nous allons créer un composant permettant d’afficher le graphe mais libre à vous d’organiser votre projet différemment.

Maintenant, créons le composant que j’ai appelé « view-graph » en utilisant cette commande :

ng generate component view-graph

Le nouveau composant, view-graph, se trouve sous /src/app/ et se compose de quatre fichiers différents :

  • .CSS : Tous les CSS pour les styles doivent aller dans ce fichier.
  • .HTML : Ce fichier comprend le modèle HTML et toutes les balises HTML.
  • TS : Ce fichier comprend tout le code application, la logique métier, les appels API et la manipulation des données.
  • SPEC.TS:Tous les tests unitaires vont dans ce fichier.

Nous modifions « app component » pour appeler le nouveau composant « view-graphe ».

Pour cela nous retirons le contenu par défaut de app/app.component.html et ajoutons le nouveau composant :

<div id="main-head" style="text-align:center">
  <h1>
    {{ title }}!
  </h1>
  <app-view-graph></app-view-graph>
</div>
<router-outlet></router-outlet>

3. Intégrer Highcharts au projet Angular

Installons maintenant dans notre projet Angular le module Highcharts en lançant la commande :

npm install highcharts

Modifions view-graph.component.ts pour importer la librairie Highcharts :

import { Component, OnInit } from '@angular/core';
import * as Highcharts from 'highcharts';

declare var require: any;


@Component({
  selector: 'app-view-graph',
  templateUrl: './view-graph.component.html',
  styleUrls: ['./view-graph.component.css']
})
export class ViewGraphComponent implements OnInit {
  public options: any = {
    Chart: {
      type: 'area',
      height: 700
    },
    title: {
      text: 'Evolution de la population'
    },
    credits: {
      enabled: false
    },
    xAxis: {
      categories: ['1750', '1800', '1850', '1900', '1950', '1999', '2050'],
      tickmarkPlacement: 'on',
      title: {
          enabled: false
      }
  },
    series: [{
      name: 'Asia',
      data: [502, 635, 809, 947, 1402, 3634, 5268]
  }, {
      name: 'Europe',
      data: [163, 203, 276, 408, 547, 729, 628]
  }, {
      name: 'America',
      data: [18, 31, 54, 156, 339, 818, 1201]
  }]
  }

  constructor() { }

  ngOnInit() {
    Highcharts.chart('container', this.options);
  }

}

N’oublions pas de modifier view-graph.component.html pour ajouter une div permettant d’afficher le graphe sur la page web :

<p>view-graph works!</p>

<div id="container"></div>

Il ne reste plus qu’à visualiser le résultat dans le navigateur :

Angular

Félicitations ! Si vous avez suivi toutes les étapes de ce tutoriel, vous pouvez maintenant créé une application Angular affichant un graphique qui exploite la puissance de Highcharts. N’hésitez pas à tester d’autres type de graphiques car le choix est très vaste et vous trouverez très certainement celui qui répondra à vos besoins.

J’espère que ce projet vous aidera à mieux comprendre comment construire une application Angular et comment intégrer la bibliothèque Highcharts. N’hésitez pas à ajouter vos commentaires ou questions ci-dessous, je me ferai un plaisir d’y répondre.

 

JavaScript : Comment trier une liste et l’afficher sur une page web ?

Lors d’un précédent billet, je vous avais présenté une méthode pour trier une liste en JavaScript. A l’époque, la sortie se faisait via la console. Dans la vraie vie du développeur Front, on affiche rarement le résultat sur la console (sauf pour débuguer).

Aussi, avec ce nouvel article je vais vous montrer comment effectuer les mêmes tris mais avec un affichage sur une page web.

Pour que ce soit joli, je vais utiliser Bootstrap pour donner un aspect sympathique à l’affichage.

Structure HTML de la page

Coté structure de la page en HTML, on reprend la base du dernier exemple avec les deux boutons permettant d’afficher le trie par âge et le trie par nom des personnages de notre jeu (reprise de l’exemple).

Puis on prépare l’espace où on affichera le résultat après chaque clic sur l’un ou l’autre bouton de choix. L’id utilisé pour cette sortie se nomme  » résultat  » :

<div class="container-fluid">
    <h2>Trier en javaScript</h2>
    <button type="button" class="btn btn-primary btn-sm" onclick="sortName()">Par Prénom</button>
    <button type="button" class="btn btn-secondary btn-sm" onclick="sortAge()">Par Age</button>

    <h3>Résultat</h3>
    <div>
        <div class="row">
            <div class="col-12 col-md-4">
                <div id="resultat"></div>
            </div>
            <div class="col-12 col-md-8">
            </div>
        </div>
    </div>
</div>

Côté JavaScript

On retrouve notre fière équipe avec ses caractéristiques. C’est juste un prétexte pour disposer de chaînes de caractères (String) et de nombres à trier pour notre exemple de trie avec JavaScript :

var warrior=[ 
    { name: "Kraken", age: 21, weapon: "arc" },
    { name: "Améria", age: 27, weapon: "fusil" },
    { name: "Narfy", age: 25, weapon: "couteau" },
    { name: "Golïm", age: 17, weapon: "poignard" },
    { name: "Fôrfiot", age: 18, weapon: "lance-flamme" },
    { name: "Nolülf", age: 23, weapon: "hache" },
    { name: "Joliett", age: 22, weapon: "bazooka" }
];

Fonction affichage tableau

En JavaScript, on va passer par une fonction qui a pour mission de générer l’affichage du résultat du trie sous forme de tableau à l’emplacement repéré par l’id défini nommé  » resultat  » (vu au-dessus).

Vous repérez facilement les balises HTML mentionnées dans cette fonction pour constituer le tableau de données triées :

function display(i) {
    console.log(i);
    var html = document.getElementById('resultat').innerHTML;
    html = html + "<table class='table table-striped'>";
    html = html + "<thead class='thead-inverse'><tr>";
    html = html + "<th scope='col'>Nom</th><th scope='col'>Age</th><th scope='col'>Arme</th>";
    html = html + "</thead></tr>";
    html = html + "<tbody>";
    warrior.forEach(function (warrior) {
        html = html + "<tr>";
        html = html + "<td>" + warrior.name + "</td><td>" + warrior.age + "</td><td>" + warrior.weapon + "</td>";
        html = html + "</tr>";
    }) html = html + "</tbody>";
    html = html + "</table>";
    document.getElementById('resultat').innerHTML = html;
}

Trier des nombres

Ici rien de nouveau sous le soleil car on reprend tout simplement la fonction de la dernière fois pour trier par âge :

function sortAge() {
    document.getElementById('resultat').innerHTML = " ";
    var intro = "Trié par age croissant";
    warrior.sort(function (a, b) {
        return a.age - b.age;
    });
    display(intro);
}

Trier des String (chaînes de caractères)

De la même manière, on reprend tout simplement la fonction de la dernière fois pour trier par nom en utilisant la fonction sortName() :

function sortName() {
    document.getElementById('resultat').innerHTML = " ";
    var intro = "Trié par nom croissant";
    warrior.sort(function (a, b) {
        return a.name.localeCompare(b.name);
    });
    display(intro);
}

 

Et voilà le tour est joué !
Cette proposition de solution pour trier des données en JavaScript n’est évidemment pas la seule et unique possibilité. Vous pouvez très bien développer d’autres méthodes ou fonctions pour arriver au même résultat.

Comme j’adore échanger, vous pouvez laisser un commentaire ou partager votre avis ou méthode.