Webcomponents y Polymer 2. Ejemplos. Parte 3
Componentes nativos
Para realizar este ejemplo no es necesaria ninguna librería ni framework ya que se usa HTML, CSS y Javascript.
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Componentes nativos</title> <style> h3 { color: #00ff00; } li { color: #0000ff; } </style> </head> <body> <!-- Inicio del contenido de la página --> <h3>Fuera componente</h3> <ul> <li>AAA</li> <li>BBB</li> <li>CCC</li> </ul> <!-- Uso del componente --> <componente-basico></componente-basico> <!-- Definición del template para el componente --> <template id="listado"> <!-- Estilos dentro del componente --> <style> ul { list-style: none; margin: 0; padding: 0; } li { color: #ff00ff; font-weight: bold; } </style> <!-- HTML dentro del componente --> <h3>Listado</h3> <ul> <li>A</li> <li>B</li> <li>C</li> <li>D</li> <li>E</li> </ul> </template> <script> // Clase para implementar el componente class ComponenteBasico extends HTMLElement { constructor() { // Siempre debe llamarse primero al constructor padre super(); // Guardamos el template let listado = document.getElementById("listado"); // Adjunta un árbol del Shadow DOM al elemento especificado y devuelve una referencia a su ShadowRoot this.attachShadow({ mode: 'open' }).innerHTML = listado.innerHTML; } } // Asociar la clase al nombre del componente customElements.define("componente-basico", ComponenteBasico); </script> </body> </html>
Para que todo sea muy simple, he creado todo el código en un único fichero para entender todas las partes del componente.
Componentes con Polymer 2
Vamos a crear dos ficheros. El primer fichero sera una página simple donde importaremos el componente y el segundo fichero sera el componente:
index.html
<!DOCTYPE html> <html lang="es"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Polymer 2</title> <link rel="import" href="./componente-basico/componente-basico.html"> </head> <body> <componente-basico></componente-basico> </body> </html>
componente-basico.html
<link rel="import" href="../bower_components/polymer/polymer-element.html"> <dom-module id="componente-basico"> <template> <style> :host { display: block; margin: 15px; } h1 { color: #ff0000; } </style> <h1> Componente básico </h1> </template> <script> class ComponenteBasico extends Polymer.Element { static get is() { return 'componente-basico'; } } window.customElements.define(ComponenteBasico.is, ComponenteBasico); </script> </dom-module>