.. role:: problema-contador Componentes web =============== Los componentes web son un conjunto de estándares que permiten crear elementos de HTML reutilizables en diferentes aplicaciones web. Estos componentes encapsulan su comportamiento y apariencia de forma independiente al resto de la aplicación. La idea es que los programadores tengan a su disposición un abánico de componentes web específicos para las diferentes necesidades de su aplicación web (mostrar un selector de fecha, reproducir un fichero de audio, mostrar un mapa interactivo, etc.) y que puedan integrarlos cómodamente en sus aplicaciones. Aunque las tecnologías implicadas tienen ya cierto tiempo, su uso explícito por los programadores de aplicaciones web no está muy extendido todavía, en parte por la proliferación de *frameworks* y herramientas (`Angular`_, `React`_, `Vue`_, `Stencil`_, `Ionic`_, `LitElement`_...) que ofrecen una sintaxis de más alto nivel para su definición y uso, además de ampliar su funcionalidad. En la línea seguida en este curso de abordar las tecnologías web a niveles no muy elevados de abstracción, estudiaremos aquí las tecnologías subyacentes y crearemos nuestros componentes web con ellas. .. _`Angular`: https://angular.io/ .. _`React`: https://reactjs.org/ .. _`Vue`: https://vuejs.org/ .. _`Stencil`: https://stenciljs.com/ .. _`Ionic`: https://ionicframework.com/ .. _`LitElement`: https://lit-element.polymer-project.org/ .. Important:: Las habilidades que deberías adquirir con este tema incluyen las siguientes: - Comprender la diferencia entre *shadow DOM* y *light DOM*. - Entender cómo se modifica la representación de una página tras incluir un *shadow tree* en ella. - Comprender la utilidad de encapsular partes de una página web en un componente web. - Saber como crear componentes web mediante las API estándar. - Saber cómo modificar la presentación de un componente sin modificar el DOM global. .. _label-intro-comp: Introducción a los componentes web ---------------------------------- Los componentes web permiten crear elementos de HTML reutilizables. Por ejemplo, una librería de componentes web podría permitirnos insertar en una página web un `indicador del progreso`_ de una descarga con el siguiente fragmento de HTML: .. code-block:: html .. _`indicador del progreso`: https://explore.fast.design/components/fast-progress-ring El componente web podría definir adicionalmente una serie de funciones (una API) para interactuar con él desde nuestro código en JavaScript. El elemento HTML creará normalmente al iniciarlo algunos nodos de HTML adicionales. Cuando el navegador inserta en el DOM el subárbol resultante, crea una especie de *barrera protectora* que impide que los estilos aplicados al documento permeen a dicho subárbol y que funciones como ``document.querySelector`` puedan encontrar sus nodos; será necesario, como veremos, buscarlos mediante ``nodo.shadowRoot.querySelector``, donde ``nodo`` es una referencia al nodo que incluye el subárbol DOM como, por ejemplo, ``fast-progress-ring`` en el caso anterior. Se facilita así que los componentes web tengan su propio estilo y comportamiento diferenciado de los del resto de la aplicación. .. ejemplo de uso del componente de indicación de progreso con la librería Fast: https://codepen.io/jaspock/pen/RwRMMqe La tecnología de los componentes web se basa principalmente en las siguientes tecnologías estandarizadas: - el *DOM ensombrecido* (*shadow DOM*), que permite crear un subárbol DOM aislado del árbol DOM global (también llamado *DOM iluminado*, *light DOM*, nombre que se ha popularizado para diferenciar el DOM global del DOM ensombrecido); - los *elementos personalizados* (*custom elements*), que permiten al desarrollador definir sus propios elementos de HTML; los elementos personalizados son elementos HTML como ``

`` o ```` pero definidos por nuestro código usando una serie de funciones estándar soportadas por los navegadores; - más secundariamente, las *plantillas* (*templates*), que permiten encapsular bloques de contenido (HTML), presentación (CSS) y funcionalidad (JavaScript) de forma que no son tenidos en cuenta inmediatamente por el navegador y solo se *activan* posteriormente al ejecutar determinado código de JavaScript. .. figure:: https://media.prod.mdn.mozit.cloud/attachments/2018/01/29/15788/9d23f749f26b93a00f5c2aa72f00e720/shadow-dom.png :target: https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_shadow_DOM :alt: shadow DOM :figwidth: 70 % El DOM ensombrecido tiene un nodo raíz virtual (*shadow-root*). El *shadow-host* es el nodo del componente web que alberga este subárbol. .. _label-ejemplo-comp: Un ejemplo sencillo de componente web ------------------------------------- Vamos a ver las tecnologías de *shadow DOM*, elementos personalizados y plantillas juntas en acción, comenzando con el siguiente ejemplo (que puedes probar `aquí `_) de un componente web sencillo y bastante poco útil que iremos ampliando sucesivamente: .. code-block:: html :linenos: :force: Definición de componentes web

Definición de componentes web

Fin de la pagina.

La página web anterior incluye un elemento ``