Exemples de Vanilla JSX
Et si JSX renvoyait des éléments DOM ?
- La fonction
ClickMe crée un bouton et affiche le nombre de clics
- Le texte est mis à jour à chaque clic sur le bouton
export default function ClickMe() {
let i = 0;
const el = <button>Click me</button> as HTMLButtonElement;
el.onclick = (e) => {
el.textContent = `Clicked ${++i} times`;
};
return el;
}
Réutilisabilité
- Le composant
ClickMe peut être utilisé plusieurs fois, chaque instance conservant son propre état
import ClickMe from "./sample1.js";
export default () => <>
<p><ClickMe /></p>
<p><ClickMe /></p>
<p><ClickMe /></p>
</>;
Création d’un arbre DOM interactif
- Les classes
TodoInput et TodoList permettent de gérer une liste de tâches
- Il est possible d’ajouter des éléments et de les supprimer par clic
function TodoInput(attrs: { add: (v: string) => void }) {
const input = <input /> as HTMLInputElement;
input.placeholder = 'Add todo item...';
input.onkeydown = (e) => {
if (e.key === 'Enter') {
attrs.add(input.value);
input.value = '';
}
};
return input;
}
class TodoList {
ul = <ul class='todolist' /> as HTMLUListElement;
add(v: string) {
const item = <li>{v}</li> as HTMLLIElement;
item.onclick = () => item.remove();
this.ul.append(item);
}
}
export default () => {
const list = new TodoList();
list.add('foo');
list.add('bar');
return <>
<TodoInput add={(v) => list.add(v)} />
{list.ul}
</>;
};
Traitement de grandes quantités de données
- La fonction
FindNames traite et filtre un grand volume de données pour afficher les résultats
- Les éléments correspondants sont mis à jour en temps réel selon la valeur saisie
import { data } from "../fetch-dataset.js";
export default function FindNames() {
const status = <p style='margin:1em 0' /> as HTMLParagraphElement;
const results = <ul /> as HTMLUListElement;
const input = <input value='eri(c|k)a?' autocomplete='new-password' oninput={updateMatches} /> as HTMLInputElement;
updateMatches();
function updateMatches() {
const matched = (data.entries().filter(([k]) => k.match(input.value)).toArray());
const matches = (Iterator.from(matched).map(match => <Item regex={input.value} match={match} />).take(30));
results.replaceChildren(...matches);
status.textContent = `${matched.length} / ${data.size}`;
}
return <div class='sample4'>
{input}
{status}
{results}
</div>;
}
function Item(attrs: { match: [string, number], regex: string }) {
const [name, count] = attrs.match;
const total = <small style='color:#fff3'>({count})</small>;
return <li>
<span innerHTML={highlight(name, attrs.regex)} /> {total}
</li>;
}
function highlight(str: string, regex: string) {
if (!regex) return str;
const r = new RegExp(`(${regex})`, 'gi');
return str.replace(r, '<span class="match">$1</span>');
}
Présentation d’imlib
imlib est une bibliothèque développée pour immaculatalibrary.com
- Elle a été utilisée pour construire minigamemaker.com ainsi que le site web que vous êtes en train de lire
- Elle a été créée parce que les solutions existantes ne suffisaient pas, et c’est la méthode préférée de l’auteur pour créer des applications
Résumé de GN⁺
- Cet article explique comment créer directement des éléments DOM et interagir avec eux à l’aide de JSX
- Il présente une manière de traiter efficacement de grands volumes de données sans utiliser de DOM virtuel
- La bibliothèque
imlib permet de développer des applications de façon simple et intuitive
- D’autres projets aux fonctionnalités similaires incluent React et Vue.js
1 commentaires
Avis Hacker News
Merci de vous intéresser au projet
Si l’on renvoie de vrais nœuds DOM, on perd un gros avantage de JSX
L’origine de JSX remonte à XHP de Facebook
L’exemple final ne fonctionne pas dans Firefox
Très similaire à Vanilla TSX
Cela fait penser à Action Script 3
Les exemples ne montrent pas de composants avec des props susceptibles de changer au fil du temps
J’ai moi aussi créé une bibliothèque UI basée sur des expressions de template jsx qui génèrent de vrais nœuds DOM
Je ne comprends pas l’attrait de JSX
Je recommande Imba