Bases de Svelte
Introduction
Liaisons
Classes et styles
Attachements
Svelte avancé
Réutiliser du contenu
Mouvements
Liaisons avancées
Transitions avancées
API de contexte
Éléments spéciaux
<script module>
Next steps
Bases de SvelteKit
Introduction
Routing
Chargement de données
En-têtes et cookies
Modules partagés
Formulaires
$app/state
Erreurs et redirections
SvelteKit avancé
Options de page
Options de lien
Routing avancé
Chargement avancé
Variables d’environnement
Conclusion
Il est courant d'avoir besoin d'un attachement qui dépend de certains paramètres ou de l'état d'un composant. Dans ce scénario, vous pouvez utiliser une usine à attachement — une fonction qui renvoie un attachement.
Dans cet exercice, nous voulons ajouter un tooltip au <button> en utilisant la librairie
Tippy.js. L'attachement est déjà câblé avec {@attach tooltip}, mais si vous survolez le bouton (ou si vous le focalisez avec le clavier), le tooltip
s'affiche vide.
D'abord, nous avons besoin de convertir notre attachement classique en fonction d'usine qui renvoie un attachement.
function tooltip( ) {
return (node) => {
const tooltip = tippy(node);
return tooltip.destroy;
};
}Puis, l'usine doit accepter les options que nous voulons passer à Tippy (dans ce cas, uniquement
content) :
function tooltip(content) {
return (node) => {
const tooltip = tippy(node, { content });
return tooltip.destroy;
};
}L'expression
tooltip(content)est exécutée au sein d'un effet, l'attachement est donc détruit et recréé lorsque quecontentest mis à jour.
Enfin, nous devons appeler l'usine à attachement et lui passer l'argument content dans notre
balise {@attach} :
<button {@attach tooltip(content)}>
Survolez-moi
</button>Modifier cette page sur Github
<script>
import tippy from 'tippy.js';
let content = $state('Hello!'); function tooltip(node) {const tooltip = tippy(node);
return tooltip.destroy;
}
</script>
<input bind:value={content} /><button {@attach tooltip}>Survolez-moi
</button>
<style>
:global { [data-tippy-root] {--bg: #666;
background-color: var(--bg);
color: white;
border-radius: 0.2rem;
padding: 0.2rem 0.6rem;
filter: drop-shadow(1px 1px 3px rgb(0 0 0 / 0.1));
* {transition: none;
}
}
[data-tippy-root]::before {--size: 0.4rem;
content: '';
position: absolute;
left: calc(50% - var(--size));
top: calc(-2 * var(--size) + 1px);
border: var(--size) solid transparent;
border-bottom-color: var(--bg);
}
}
</style>