Skip to content

Instantly share code, notes, and snippets.

@joelalejandro
Created September 5, 2020 00:10
Show Gist options
  • Save joelalejandro/10966e0a55266aee2858b09b42b2d366 to your computer and use it in GitHub Desktop.
Save joelalejandro/10966e0a55266aee2858b09b42b2d366 to your computer and use it in GitHub Desktop.
Introducción a componentes Web
// Esta función utilitaria nos permite cargar el contenido de <template>
// para cualquier componente.
function cargarTemplate(referenciaTemplate, instanciaComponente) {
const template = document.querySelector(referenciaTemplate);
const templateContent = template.content;
instanciaComponente.attachShadow({ mode: "open" })
.appendChild(templateContent.cloneNode(true));
}
/* Definición del componente */
class TabifitLogo extends HTMLElement {
constructor() {
super();
cargarTemplate("#tabifit-logo", this);
}
}
/* Registro del componente */
customElements.define("tabifit-logo", TabifitLogo);
class TabifitTitle extends HTMLElement {
constructor() {
super();
cargarTemplate("#tabifit-title", this);
}
}
customElements.define("tabifit-title", TabifitTitle);
/* Podemos estilizar nuestros componentes como si fueran etiquetas HTML! */
tabifit-logo {
display: block;
margin: 0 auto;
width: 300px;
}
<!--
Paso 1: Nombrar nuestro componente, con algún prefijo, un guión medio
y el nombre del componente en sí mismo. Ejemplo: para el componente
de logo de nuestra aplicación, crearemos "tabifit-logo".
-->
<tabifit-logo></tabifit-logo>
<tabifit-title>Series</tabifit-title>
<tabifit-title>Vueltas</tabifit-title>
<!--
Paso 2: Creamos una etiqueta <template> cuyo ID sea igual al nombre del
componente.
-->
<template id="tabifit-logo">
<!--
Paso 3: Escribo los estilos del componente dentro de <template>,
usando una etiqueta <style>
-->
<style>
/* Estilos del componente */
img {
border: 2px solid red;
}
</style>
<!-- Paso 4: Escribimos lo que queremos mostrar en el componente,
es decir, el HTML puro -->
<img src="https://placehold.it/300x300">
</template>
<template id="tabifit-title">
<style>
h1 {
color: blue;
}
</style>
<h1>
<!-- Acá va el contenido que se puso en la etiqueta afuera -->
<slot />
<!-- SLOT se reemplaza con lo que le pasemos al componente por dentro -->
<img src="https://placehold.it/48x48">
</h1>
</template>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment