J'utilise Svelte 3 avec l'option de générer des éléments personnalisés avec Shadow DOM mais je ne parviens pas à trouver comment obtenir une référence à l'élément personnalisé wrapper (HTMLElement) afin de pouvoir attacher des gestionnaires d'événements et manipuler des attributs. J'ai quelque chose comme ceci:
<svelte:options tag="custom-button"/> <script> import { onMount } from 'svelte'; function _onClick(e) { this.setAttribute('pressed', null); } var _boundClick = _onClick.bind(this); onMount((e) => { this.addEventListener('click', _boundClick); return () => { this.removeEventListener('click', _boundClick); }; }); </script> <style> :host { display: block; } /* Other Styling */ </style> <slot></slot>
Les bits "this" ne fonctionnent pas (ils le font dans un élément personnalisé vanilla normal). Existe-t-il un moyen spécifique à Svelte d'obtenir une référence à l'élément hôte dans un script?
Merci
3 Réponses :
Je pense que vous voulez créer un élément qui entoure l'emplacement, puis le lier à une variable en utilisant bind: this = {var}
comme indiqué dans cet exemple: https://svelte.dev/docs#Binding_a_DOM_node
donc quelque chose comme
let customButton; function _onClick(e) { customButton.setAttribute('pressed', null); }
À l'heure actuelle, ce n'est pas possible directement, même si ce serait un ajout intéressant. Je viens de signalé un problème .
L'approche indirecte serait de faire bind: this = {element}
sur l'élément de niveau supérieur à l'intérieur de votre élément personnalisé (en supposant que vous en ayez un), alors vous pourriez faire quelque chose de long sur les lignes de $: host = element && element.parentNode.host
. Vous n'y auriez pas accès lors de l'initialisation, mais il serait prêt dans onMount
.
Cela a fonctionné pour moi. Cependant, un nitpick: host n'était toujours pas défini dans onMount, mais il était disponible dans un gestionnaire de clics (quelques nanosecondes plus tard).
Une solution possible est d'utiliser la fonction get_current_component de svelte / internal
import { get_current_component } from 'svelte/internal'; let host = get_current_component();
Je pense que l'exportation de cette fonction serait très utile.