Estoy tratando de crear una función que tome un objeto con algunos parámetros y devuelva un div recién creado.
Por lo que puedo ver, parece que hay dos formas principales de lograr esto:
las entradas de las funciones no son generadas por el usuario, por lo que no creo que el uso de literales de plantilla cree un problema de seguridad (infórmeme si me equivoco)
Así que ahora mis preguntas son las siguientes:
a continuación puede ver las dos soluciones que he encontrado.
function createDiv (entry) { const div = document.createElement('div') div.classList.add('exchange') div.id = entry.exchange const img = document.createElement('img') img.src = `/static/img/${entry.img}.png` img.alt = entry.name img.classList.add('logo-image') div.appendChild(img) const link = document.createElement('a') link.href = entry.url link.classList.add('name') link.innerText = entry.name div.appendChild(link) const routing = document.createElement('span') routing.innerText = entry.routing ? entry.routing : '' div.appendChild(routing) const price = document.createElement('span') price.innerText = entry.price price.classList.add('price') div.appendChild(price) return div } function createDiv (entry) { const div = document.createElement('div') div.classList.add('exchange') div.id = entry.exchange let text = ` <img class="logo-image" src="/static/img/${entry.img}.png" alt="${entry.name}"> <a class="exchange-name" href="${entry.url}">${entry.name}</a> <span>${routing.innerText = entry.routing ? entry.routing : ''}</span> <span class="price">${entry.price}</span> ` div.innerHTML = text return div }¡Gracias de antemano!
¿Qué hay de hacer algo como lo siguiente?
const createDiv = ({ exchange, img, name, url, routing: entryRouting, price }) => { return ` <div class="exchange" id="${exchange}"> <img class="logo-image" src="/static/img/${img}.png" alt="${name}"> <a class="exchange-name" href="${url}">${name}</a> <span>${routing.innerText = entryRouting || ''}</span> <span class="price">${price}</span> </div> `; }En este caso, obtiene todo el poder de los literales de plantilla y de la destrucción de objetos .
Acerca de los valores, debe validarlos de alguna manera antes de almacenarlos en la base de datos y desinfectar el HTML antes de recuperarlo. Algún tipo de validación fácil con expresiones regulares podría ser suficiente para la validación. Para desinfectar, puede elegir una de las muchas bibliotecas como esta https://www.npmjs.com/package/sanitize-html .
Acerca de las actuaciones , no me lo tomaría demasiado en serio hasta que hagas muchas iteraciones. Por lo que veo, es una llamada de función única. Así que optaría por la forma más limpia: cadenas de plantilla. Pero si tiene curiosidad, la cadena de plantilla es la más rápida. El primer enfoque es casi un 100% más lento. Puede consultar los resultados de la prueba que hice en más de 100 iteraciones aquí https://jsbench.me/7gkw1t31rs/2 .
Recuerde que el enfoque que le estoy diciendo necesitará un HTML interno una vez que la función createDiv devuelva su valor.