Lograr que una tabla dinámica permita agregar y eliminar elementos es uno de los pasos más satisfactorios al construir una aplicación web. Con las funciones de generación de etiquetas que ya se construyeron en clases anteriores, ahora es momento de crear el botón de eliminar, conectarlo a cada fila y actualizar los totales automáticamente.
¿Cómo se estructura el botón de eliminar en HTML?
Dentro del <tbody>, cada fila ya mostraba cuatro celdas: descripción, calorías, carbohidratos y proteínas. Para incorporar la acción de eliminar, se necesita una celda adicional que contenga un botón. La estructura que se busca generar es la siguiente [1:00]:
- Un elemento
<button> con las clases button y button-outline-danger, ambas proporcionadas por Bootstrap.
- Un atributo
onClick que ejecute la función removeItem pasándole el index del elemento.
- Dentro del botón, una etiqueta
<i> con las clases fas y fa-trash-alt para mostrar el ícono de basura.
Estas clases ya están disponibles en el boilerplate del proyecto, así que no hace falta escribir CSS adicional.
¿Cómo generar el ícono y el botón con JavaScript?
Primero se crea una constante llamada trashIcon utilizando la función tag, a la que se le pasa un objeto con la propiedad tag: "i" y dentro de attributes la clase fas fa-trash-alt [2:34]. Es importante recordar que el segundo argumento de la función tag debe ser un string vacío cuando la etiqueta no tiene contenido interno.
javascript
const trashIcon = tag({ tag: 'i', attributes: { class: 'fas fa-trash-alt' } }, '');
Después, dentro de la función renderItems, se genera el botón de forma dinámica. El método map de JavaScript puede recibir un segundo argumento además del elemento actual: el index [3:22]. Este índice indica la posición dentro del arreglo y permite saber exactamente qué fila eliminar.
javascript
const removeButton = tag({
tag: 'button',
attributes: {
class: 'button button-outline-danger',
onClick: removeItem(${index})
}
}, trashIcon);
Finalmente, se agrega removeButton como la quinta celda dentro de la fila, componiendo funciones tal como se venía haciendo con las celdas anteriores.
¿Qué errores comunes pueden aparecer?
Al probar por primera vez, es posible que el resultado no sea el esperado. Dos errores frecuentes que surgieron durante la práctica [4:25]:
- Olvidar el segundo argumento de la función
tag: cuando una etiqueta no tiene contenido, se debe pasar un string vacío.
- Comillas modificadas por el editor: algunos editores reemplazan comillas dobles estándar por comillas tipográficas, lo que rompe el código.
Corregir estos detalles es suficiente para que el botón con el ícono de basura se renderice correctamente.
¿Cómo funciona la lógica de eliminación con splice?
La función removeItem recibe el index como argumento y utiliza el método splice de JavaScript [5:30]. Este método modifica el arreglo original eliminando elementos a partir de una posición específica.
javascript
const removeItem = (index) => {
items.splice(index, 1);
updateTotals();
renderItems();
};
splice(index, 1) elimina un solo elemento en la posición indicada.
- Después de eliminar, se llama a
updateTotals para recalcular calorías, carbohidratos y proteínas.
- Se ejecuta
renderItems para volver a dibujar la lista actualizada en pantalla.
¿Por qué es importante el index en el método map?
Hasta este punto solo se había utilizado el primer argumento de map, que representa el elemento actual del ciclo. Al incorporar el segundo argumento, el index, se obtiene la posición exacta de cada elemento dentro del arreglo [3:22]. Esto resulta esencial para conectar cada botón de eliminar con su fila correspondiente, haciendo que la interacción sea precisa.
Con estas adiciones, el proyecto ya permite agregar elementos, eliminarlos y actualizar los totales de forma automática. Si notaste algún detalle adicional o tienes dudas sobre el uso de splice o map, compártelo en los comentarios.