⚠️ version
Ce document n’est qu’un premier brouillon en attente d’une relecture complète et de tests en situation réelle. Merci de me signaler toute erreur, incohérence ou manque de clarté.
⚠️ attention
Les “code de base” donnés ne sont là que pour offrir un point de départ. Vous pourrez parfois y retrouver de mauvaises pratiques et raccourcis. Assurez-vous dès le départ d’identifier de tels problèmes et de les corriger.
| | | | ——– | —– | | Sujet | Revoir les standards de base en lien avec les Web Components. | | Objectif | Comprendre l’approche générale “composants” de la plateforme web et disposer d’un environnement de développement familier pour la suite. |
Prenez le temps d’explorer MDN et le standard HTML.
| | | | ——– | ——— | | Sujet | Rappels DOM & AJAX | | Objectif | Charger des données depuis une API et les afficher dans le DOM. |
fetch('https://jsonplaceholder.typicode.com/users')
.then((response) => response.json())
.then((users) => {
// Insérez le code pour générer un tableau ici
});
| | | | ——– | —— | | Sujet | Templates HTML | | Objectif | Charger dynamiquement le contenu initial d’un custom element |
<template id="user-card">
<div class="card">
<h3>Nom :</h3>
<p>Description :</p>
</div>
</template>
| | | | ——– | ——— | | Sujet | Shadow DOM et CSS | | Objectif | Appliquer des styles à un custom element sans impacter son contexte. |
class UserCard extends HTMLElement {
constructor() {
super();
const shadow = this.attachShadow({ mode: 'open' });
shadow.innerHTML = `
<style>
:host {
display: block;
background-color: blue;
color: white;
border: none;
padding: 10px;
}
h3 {}
p {}
</style>
<h3>Nom : </h3>
<p>Description : </p>
`;
}
}
customElements.define('styled-button', StyledButton);
| | | | ——– | —— | | Sujet | Custom Elements & attributs HTML | | Objectif | Apprendre à passer des données via des attributs. |
<user-card> et donnez lui 3 attributs : name, email et role.class UserCard extends HTMLElement {
connectedCallback() {
const name = this.getAttribute('name') || 'Nom inconnu';
const email = this.getAttribute('email') || 'Email inconnu';
const role = this.getAttribute('role') || 'Rôle non défini';
this.innerHTML = `
<div class="card">
<h3>${name}</h3>
<p>Email : ${email}</p>
<p>Rôle : ${role}</p>
</div>
`;
}
}
customElements.define('user-card', UserCard);
| | | | ——– | —— | | Sujet | Slots et contenu dynamique | | Objectif | Maitrisez les slots pour permettre de dynamiser le contenu des web components. |
<user-card> et permettez de définir tout le contenu de la “card” via un slot.name,email,role)<user-details> utilisant ce template.<user-details> dans <user-card> afin que ce dernier ne gère plus que la logique d’affichage des 3 données passées en attribut et les styles associés.| | | | ——– | —— | | Sujet | Compatibilités entre les standards Weh Component et les principales bibliothèques / frameworks web. | | Objectif | Identifiez les limites, pré-requis et bonnes pratiques associés à l’utilisation de Web Components avec les principales bibliothèques / frameworks web. |
npx create-next-app@latest<user-card> et affichez le<user-card> dans un React Server Componentfunction App() {
useEffect(() => {
const card = document.querySelector('user-card');
card.setAttribute('name', 'Alice');
card.setAttribute('img', 'alice.jpg');
card.setAttribute('description', 'Ingénieure Logiciel');
}, []);
return <user-card />;
}