La position actuelle:Accueil du site>Composants web - cycle de vie des éléments personnalisés
Composants web - cycle de vie des éléments personnalisés
2022-07-23 11:21:53【Pyjama oriental】
J'ai dû comprendre Web Component,Savoir jouer,Mais il y a eu quelques erreurs avant de les trouver après avoir consulté les données
Node.cloneNode Les limites de
Avant,Utilisétemplate.content.cloneNode(true);Pour créer un nouveau noeud,Cette approche comporte certaines limites:Tous les attributs et valeurs d'attribut du noeud original sont copiés,Cela inclutid,De cette façon, il y a plusieursidLes mêmes éléments
Copiez toutes ses propriétés et leurs valeurs,Bien sûr, cela inclut les événements liés aux propriétés(Par exemple, οnclick=“alert(1)”),Mais ne copiez pas ces utilisations addEventListener()Méthode ou node.onclick = fn Cette utilisation JavaScript Événements liés dynamiquement. --mdn
MDN Il y a aussi des avertissements
Attention!:Pour éviter l'apparition de deux ID Éléments répétitifs,Utiliser cloneNode()Le noeud cloné par la méthode doit spécifier un autre noeud avec l'original si nécessaire ID Valeurs différentes ID
Et,Du noeud généréownerDocumentToujours pointant vers le noeud sourceownerDocument
Puisque cette méthode a certaines limites,Y a - t - il un meilleur moyen?Oui.!
document.importNode
document.importNodeCopie d'un noeud d'un document externe,Vous pouvez ensuite insérer le noeud de cette copie dans le document actif
Comment utiliser
// deep Le paramètre indique si tous les noeuds enfants du noeud source sont répliqués Récursivement
const node = document.importNode(externalNode, deep);
Attention!:
Nouveau noeud de construction parentNode - Oui. null, Parce qu'il n'a pas été inséré dans l'arborescence des documents du document actif , Appartient à l'état libre , Il ne peut donc pas être utilisé
De cette façon, nous pouvons facilement modifier le nouveau noeud ownerDocument(Inappend Pointez automatiquement vers le courant après document)
Essayez le nouveau. api Pour créer_Components_
<script> class MHeader extends HTMLElement {
constructor() {
super();
// ...
const content = document.importNode(template.content, true);
/**
* Attention!, Pour insérer un noeud dans shadowRoot Avant de pouvoir l'utiliser
*/
shadowRoot.appendChild(content);
// ...
}
} </script>
HTMLElement Le cycle de vie de
Avant, Nous écrivons toutes sortes d'opérations directement dans le constructeur , C'est un peu gonflé , Y a - t - il un moyen de distribuer cette logique ?Oui.!
InHTMLElementIntérieur,Un peu.Cycle de vie
connectedCallback,Quandcustom elementInséré pour la première fois dans le document DOM Appelé quanddisconnectedCallback,Quandcustom elementDu document DOM Appelé lors de la suppression deadoptedCallback, Quandcustom elementAppelé lorsqu'il est déplacé vers un nouveau documentattributeChangedCallback,Quandcustom elementAjouter、Supprimer、 Appelé lors de la modification de ses propres propriétés
En conséquence, On peut reconstruire l'ancien _Components_
<script> class MHeader extends HTMLElement {
static get observedAttributes() {
return ["title"];
}
constructor() {
super();
// Va automatiquementthisMonter unshadowRoot
this.attachShadow({ mode: "open" });
const template = document.querySelector("#mHeaderTemplate");
// const content = template.content.cloneNode(true);
const content = document.importNode(template.content, true);
this.shadowRoot.appendChild(content);
}
connectedCallback() {
const loginBtn = this.shadowRoot.querySelector("#login");
loginBtn.addEventListener("click", () => {
this.setAttribute("title", "Connexion réussie");
});
}
attributeChangedCallback(name, oldValue, newValue) {
if (name === "title") {
this.shadowRoot.querySelector("#content").innerText = newValue;
}
}
} </script>
Ici,Nous utilisonsattributeChangedCallbackPour écouter_Components_Modification des attributs,IntitleLorsque les attributs changent, Mettre à jour la valeur de l'élément . Ce rappel renvoie trois paramètres :
name, Nom de l'attribut modifiéoldValue, Valeur avant la propriéténewValue,Valeur à définir
(react C'est beaucoup plus écrit,Un peu de rêve vue Le sentiment de )
En plus, il y a une chose à noter :
Besoin destatic get observedAttributes Déclarez le nom de la propriété à écouter dans la fonction
static get observedAttributes() {
return ["title"];
}
Code complet
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<template id="mHeaderTemplate">
<style> :host {
font-size: 32px;
}
.content {
color: #f00;
} </style>
<div>
<span class="content" id="content">Je suis la tête</span>
<button id="login">login</button>
</div>
</template>
<m-header id="mHeader" title="hello" />
<script> class MHeader extends HTMLElement {
static get observedAttributes() {
return ["title"];
}
constructor() {
super();
// Va automatiquementthisMonter unshadowRoot
this.attachShadow({ mode: "open" });
const template = document.querySelector("#mHeaderTemplate");
// const content = template.content.cloneNode(true);
const content = document.importNode(template.content, true);
this.shadowRoot.appendChild(content);
}
connectedCallback() {
const loginBtn = this.shadowRoot.querySelector("#login");
loginBtn.addEventListener("click", () => {
this.setAttribute("title", "Connexion réussie");
});
}
attributeChangedCallback(name, oldValue, newValue) {
if (name === "title") {
this.shadowRoot.querySelector("#content").innerText = newValue;
}
}
}
window.customElements.define("m-header", MHeader);
const mHeader = document.querySelector("#mHeader"); </script>
</body>
</html>
Résumé
Parce queNode.cloneNode Le nouveau noeud reste par défaut ownerDocument, Il n'y a donc aucun moyen de libérer ,Il y a des choses à noter,Mais nous pouvons utiliserdocument.importNodePour réaliser la même fonctionnalité,LeAPI Le noeud créé est libre ,En coursappend Correction automatique après l'opération ownerDocumentDirection de
En utilisantcustom elements Fonctions du cycle de vie fournies , Nous pouvons facilement écouter les changements d'attributs pour faire une certaine logique , Mais cette phrase n'est toujours pas assez facile à écrire ,Besoin d'utiliser native dom Fonctionnement api,C'est possible. jQuery J'emprunterai Web Components Pour reprendre vie
Mentions de copyright
Auteur de cet article [Pyjama oriental],Réimpression s’il vous plaît apporter le lien vers l’original, merci
https://fra.chowdera.com/2022/204/202207230538008292.html
Recommandé par sidebar
- Approfondir la file d'attente des conteneurs
- Méthode de rappel d'initialisation pour Bean et méthode de rappel pour libérer les ressources
- Enregistrer les données crawler dans la base de données MySQL
- Distribution des données via SQL
- Comment renouveler automatiquement les serrures distribuées redis (solution classique)
- Hongke Dynamics | cippe2022 est sur le point de se tenir, l'inscription est en cours
- Classe interne anonyme de kotlin (objet: XXXX)
- Interview raid: 6 grandes différences entre truncate, delete et Drop
- Ubuntu installe docker et les commandes de base de docker installent MySQL
- Leetcode - - Stack and queue articles
Devinez que vous aimez
Déploiement du cluster etcd
Dix problèmes dans la famille de protocoles TCP / IP
【 stm32 learning】 (21) stm32 Implementing Stepper Motor
Dessiner le tableau [grafana] avec les variables des critères de requête
Reconnaître les interfaces
LabVIEW: créer un VI
Cadre de développement de l'interface devextreme Gantt Control - Exporter PDF, trier les tâches
Exportation et importation de bases de données et de tableaux de données en ligne de commande MySQL
Easyeeagle, une plate - forme intelligente d'exploitation et de maintenance avec plusieurs plateformes de base de données massives
Vous souvenez - vous de offsetwidth, clientwidth, width, scrollwidth, clientx, screenx, offsetx, pagex dans JS?
Recommandé au hasard
- 【 Azure Event center】 Azure Event hub New Function attempt - GEO Disaster Recovery
- Quels sont les facteurs qui influent sur la prestation continue?
- 【 Tutoriel de démarrage rapide 7】 utilisation et introduction de l'ordinateur hôte de la station au sol de l'UAV en formation de coquille folle · Open Source
- Détails de la configuration redis
- Docker installe MySQL, redis
- Le circuit de limitation d'amplitude et le circuit de serrage utilisent la conductivité unidirectionnelle de la diode
- [carte des connaissances] cql et py2neo notes d'apprentissage
- C apprentissage des langues
- Application combinée de la ligne de transfert de colonne et de l'ensemble de données dans le scénario d'affaires
- Configuration SSL MySQL 5.6 / 5.7
- [apprentissage profond] fonction de perte (erreur absolue moyenne, erreur carrée moyenne, perte de lissage, entropie croisée, entropie croisée pondérée, perte de dé, focalloss)
- Optimisation de précision * stratégie d'optimisation 1: Réseau + optimiseur Sam
- Détails du Protocole Axi
- JS - - date Object & Ternary expression
- Leetcode - 494. Objectifs et
- L'interface utilisateur 3D ou le modèle dans l'unit é fait toujours face à la caméra et tourne avec l'angle de vue de la caméra 丨 l'angle de vue suit 丨 l'angle de vue fixe
- Discussion préliminaire sur JVM
- Déploiement de l'environnement appium pour les tests mobiles [à poursuivre]
- À propos du montage de fond, de la gestion des processus
- Lire la lecture efficace - l'auto - investissement le plus rentable
- Transplantation de systèmes embarqués
- Saisissez une chaîne de caractères à partir du clavier et affichez différents caractères et le nombre d'occurrences de chaque caractère. (la sortie n'est pas séquentielle) résoudre le problème en utilisant la méthode commune de la classe de chaîne
- 2019 Bar _ Aaai ICCN
- Conditions affectant la vitesse de requête de l'interface
- Stack et file d'attente de l'adaptateur STL
- Analyse de la stratégie de lecture et d'écriture du cache
- Classes et objets (1)
- Expérience II Yuv
- Comment synchroniser
- [arxiv2022] grouptransnet: Group transformer Network for RGB - D Salient Object Detection
- Avantages de la salle des machines bgp
- La fosse Piétinée par l'homme vous dit d'éviter les 10 erreurs courantes dans les tests automatisés
- Déterminer s'il s'agit d'un type vide
- Langue C - quelques exercices classiques de langue C
- Openvino Datawhale
- Question 300 Leçon 6 type quadratique
- Analyse du code source et de la conception de redis - - 7. Liste rapide
- Concepts et différences de bits, bits, octets et mots
- Déploiement du projet (version abrégée)
- JDBC Learning and simple Encapsulation