Directives
Les directives sont des attributs spéciaux que le compilateur comprend. La plupart fonctionnent dans
JSX et html `` ; quelques formes à mot-clé (if, each, bind:, class:name,
style:prop) sont réservées à html ``, car elles n'ont pas d'équivalent JSX propre et
vérifiable par le typage.
Événements
Événements délégués (un seul écouteur à la racine, distribué par le framework) :
html`<button @click=${onClick}>Enregistrer</button>`; // html`` — @event
// Équivalent JSX :
<button onClick={onClick}>Enregistrer</button>;
@click et onClick sont identiques. Pour un écouteur natif (addEventListener, sans
délégation — requis pour capture/once/passive), utilisez on: :
html`<div on:scroll=${onScroll}></div>`;
<div on:scroll={onScroll} />; // JSX — signature d'index on:
Modificateurs
Les modificateurs pointés fonctionnent sur les formes @/on: :
| Modificateur | Effet |
|---|---|
.capture |
écoute en phase de capture |
.once |
retiré après le premier appel |
.passive |
marque l'écouteur comme passif |
.prevent |
event.preventDefault() |
.stop |
event.stopPropagation() |
.self |
uniquement si event.target === currentTarget |
html`<form @submit.prevent=${save}></form>`;
html`<div on:wheel.passive=${onWheel}></div>`;
En JSX, oncapture:event est un raccourci pour un écouteur natif en phase de capture :
<div oncapture:click={onClick} />;
Liaisons d'élément
ref
Capture l'élément dans une variable ou un callback :
let el!: HTMLInputElement;
html`<input ref=${el} />`;
html`<input ref=${(node) => (el = node)} />`;
use — directives personnalisées
use=${fn} appelle fn(element) au montage ; la forme nommée passe des options :
html`<div use=${tooltip}></div>`;
html`<div use:tooltip=${{ text: 'Salut' }}></div>`;
<div use:tooltip={{ text: 'Salut' }} />; // JSX
prop: / attr: / bool:
Forcent la façon dont une valeur est appliquée, en contournant l'heuristique propriété-ou-attribut.
Fonctionnent dans JSX et html `` :
html`<input prop:value=${text()} />`; // toujours la propriété DOM (element.value = …)
html`<div attr:data-id=${id()} />`; // toujours setAttribute
html`<button bool:disabled=${busy()} />`; // attribut booléen : présent si vrai, retiré si faux
<my-widget prop:config={config()} />;
<circle attr:cx={x()} />;
<button bool:disabled={busy()} />;
.prop et ?attr (raccourcis html``)
Raccourcis de style lit pour la même idée :
html`<video .currentTime=${t()}></video>`; // liaison de propriété — comme prop:
html`<button ?disabled=${busy()}></button>`; // attribut booléen — comme bool:
class et style
classList et un objet style fonctionnent dans les deux surfaces :
html`<div class=${{ active: on(), big: large() }}></div>`;
html`<div style=${{ color: c(), '--x': px() }}></div>`;
<div classList={{ active: on() }} style={{ color: c() }} />;
html `` propose en plus des bascules par nom :
html`<div class:active=${on()} class:big=${large()}></div>`;
html`<div style:color=${c()} style:--x=${px()}></div>`;
html — innerHTML brut
html`<div html=${markup()}></div>`; // définit innerHTML (réactif si on passe un accesseur)
...spread
Diffuse un objet de props/attributs (fusionné avec mergeProps) :
html`<div ...${attrs}></div>`;
<div {...attrs} />;
Contrôle de flux (html`` uniquement)
Ces formes compilent vers les composants <Show> / <For> — du sucre pour les cas courants.
if / else
html`
<p if=${user()}>Bienvenue, ${user()!.name}</p>
<a else href="/login">Se connecter</a>
`;
if compile vers <Show when> ; un frère immédiatement suivant avec else devient le fallback.
each / key
html`<li each=${items()}>${(item) => item.label}</li>`;
each compile vers <For each> ; l'enfant ${item => …} est la fonction de rendu. Ajoutez
key="id" pour indexer la liste par un champ (les lignes sont alors réutilisées par identité) :
html`<li each=${rows()} key="id">${(row) => row().name}</li>`;
bind: — liaison bidirectionnelle
bind:value / bind:checked lient un champ à un tuple de signal [get, set] :
const name = createSignal('');
html`<input bind:value=${name} />`; // value + événement input
html`<input type="checkbox" bind:checked=${on} />`; // checked + événement change
JSX vs html`` en un coup d'œil
| Directive | JSX | html`` |
|---|---|---|
@click / onClick, on:event, modificateurs |
✓ | ✓ |
ref, use: |
✓ | ✓ |
prop: / attr: / bool: |
✓ | ✓ |
classList, objet style, ...spread |
✓ | ✓ |
oncapture:event |
✓ | — |
.prop, ?attr |
— | ✓ |
class:name, style:prop |
— | ✓ |
if / else, each / key, bind: |
— (utilisez <Show>/<For>) |
✓ |