Como usar la etiqueta template 💻
2 minutos de lectura
Índice
Crear elementos desde javascript dinámicamente con createElement y appendChild y luego insertarlos al documento puede hacernos escribir mucho código, o usar innerHtml nos puede dar problemas de seguridad en nuestra web. Pero afortunadamente existe la etiqueta template que nos ahorrara estos problemas.
¿Qué es?
La etiqueta html <template> es una manera de conservar html sin que se muestre al usuario para usarlo cuántas veces queramos dinámicamente desde javascript.
Como usarla
Se debe colocar el contenido que será usado dentro del elemento template y localizar el contenido de el con javascript. En este caso lo usaremos para colocar elementos dentro de la lista.
1<ul id="list"></ul>23<template id="item">4 <li>5 <section>6 <h2 class="title"></h2>7 <p class="text"></p>8 </section>9 </li>10</template>
Debemos especificar la propiedad content para usar el contenido que esta dentro de el elemento template que es el que nos interesa, no el elemento en si mismo.
1const list = document.getElementById('list')2const item = document.getElementById('item').content
Luego el contenido del elemento template se tiene que clonar, se pueden usar estas 2 formas y obtendríamos el mismo resultado.
Con cloneNode:
1const clone = item.cloneNode(true)
Con importNode:
1const clone = document.importNode(item, true)
Y así podemos modificar los elementos localizándolos y posteriormente insertándolos al documento, esto con el fin de agregar la información que queramos, artículos, listas, datos de clientes, etc. De esta forma logramos agregar información dinámicamente con mucho menos código a comparación de crear los elementos desde javascript.
1// Etiqueta h22const title = clone.querySelector('.title')3title.textContent = 'Title 1'45// Etiqueta p6const text = clone.querySelector('.text')7text.textContent = 'Lorem ipsum dolor sit amet'89// Agregar a la lista10list.appendChild(clone)
Código de ejemplo usando fragment
También podemos usar el elemento template en conjunto de fragmentos y obtener un mejor rendimiento.
1<ul id="list"></ul>23<template id="item">4 <li class="list__item">5 <section class="card">6 <h2 class="card__title"></h2>7 <p class="card__text"></p>8 </section>9 </li>10</template>
1const list = document.getElementById('list')2const itemTemplate = document.getElementById('item').content34// Se crea un fragmento5const fragment = document.createDocumentFragment()67const items = [8 { title: 'Title 1', text: 'Lorem ipsum dolor sit amet' },9 { title: 'Title 2', text: 'Lorem ipsum dolor sit amet' },10]1112// Itera el array de objectos13items.forEach((item) => {14 // Clona el contenido del template15 const clone = itemTemplate.cloneNode(true)1617 const title = clone.querySelector('.card__title')18 title.textContent = item.title1920 const text = clone.querySelector('.card__text')21 text.textContent = item.text2223 // Agrega el elemento al fragmento24 fragment.appendChild(clone)25})2627// Luego que agregar todos los elementos al fragmento, se agrega este a la lista28list.appendChild(fragment)