Contenido del curso

Herramientas avanzadas: escalabilidad, organización y persistencia

Iconos SVG en React con componentes

Resumen

Tu app de to-dos en React ya reacciona a los clics, pero todavía se ve fea: una V para completar, una X para borrar, puro texto plano. Para llevarla a nivel portafolio necesitas iconos SVG bien implementados. Aquí verás cómo agregar iconos en React, ya sea con la librería React Icons o creando tu propia librería de iconos personalizados.

¿Cuándo conviene usar React Icons y cuándo crear tu propia librería?

La decisión depende de si tu equipo de diseño tiene iconos propios o si puedes apoyarte en sets ya existentes.

React Icons es la opción más rápida y popular. Importas el componente, lo usas y listo. Incluye repertorios enormes:

  • Ant Design, ideal si te gusta ese estilo limpio.
  • Bootstrap y Font Awesome, clásicos infaltables.
  • Octicons de GitHub y Material Design.
  • Hasta los iconos de Visual Studio Code.

Ahora, si tu equipo diseñó SVGs propios, te toca usarlos. No puedes meter un icono random de otra librería porque rompe la identidad visual. Ese es el caso de la app de to-dos: el equipo de diseño entregó dos archivos, check.svg y delete.svg, y hay que integrarlos creando una librería personalizada [03:45].

¿Qué es React Icons? Es una librería que centraliza iconos de múltiples sets como Material Design, Font Awesome o Bootstrap, y los expone como componentes React listos para importar.

¿Cómo importar SVG en React con Create React App?

Create React App incluye soporte nativo para importar SVGs como componentes. La sintaxis es muy específica y hay que respetarla.

Primero arrastras tus archivos .svg a la carpeta src. Importante: si tu SVG tiene la propiedad fill con un color fijo, quítasela. Así puedes pasarle el color dinámicamente desde React más adelante.

Luego importas con esta sintaxis:

js import { ReactComponent as CheckSVG } from './check.svg'; import { ReactComponent as DeleteSVG } from './delete.svg';

El truco está en ReactComponent. Así lo diseñaron los creadores de Create React App. Cuando importas varios SVGs en el mismo archivo, usas exports nombrados renombrando cada uno (CheckSVG, DeleteSVG) para evitar conflictos [10:20].

¿Cómo crear componentes de iconos reutilizables en React?

La idea es centralizar la lógica en un solo componente, TodoIcon, y que CompleteIcon y DeleteIcon solo le pasen propiedades.

Estructura de los componentes hijos

Cada icono específico delega el trabajo pesado a TodoIcon y solo le indica qué tipo y color quiere:

jsx import React from 'react'; import { TodoIcon } from './TodoIcon';

function CompleteIcon() { return <TodoIcon type="check" color="gray" />; }

export { CompleteIcon };

Lo mismo aplica para DeleteIcon, pero con type="delete". Nombrar los componentes por su funcionalidad (CompleteIcon, DeleteIcon) en lugar de su forma (XIcon, VIcon) es buena práctica: el nombre describe qué hace, no cómo se ve.

Clases dinámicas con className

Dentro de TodoIcon, usas un span con className dinámico para que el CSS posicione cada icono correctamente:

jsx <span className={Icon-svg Icon-svg--${type}}> {/* SVG aquí */} </span>

Si recibes type="delete", se renderiza la clase Icon-svg--delete. Si recibes check, se renderiza Icon-svg--check. Cada clase aplica una posición distinta: arriba a la derecha o a la izquierda del to-do.

¿Cómo renderizar varios SVG según una prop sin condicionales complejos?

Usar un if o un ternario funciona con dos opciones, pero se vuelve ilegible si agregas más iconos. La solución elegante es un objeto que mapea tipos a componentes.

jsx const iconTypes = { check: <CheckSVG className="Icon-svg" fill="gray" />, delete: <DeleteSVG className="Icon-svg" fill="gray" />, };

function TodoIcon({ type }) { return ( <span className={Icon-svg Icon-svg--${type}}> {iconTypes[type]} </span> ); }

Una línea por cada tipo de icono. Si mañana agregas un tercer SVG, solo sumas otra entrada al objeto. Sin if, sin switch, sin spaghetti.

¿Cómo cambiar el color de un SVG en React? Quita el atributo fill del archivo SVG original y pásalo como prop al componente importado. Así el color se vuelve dinámico y reutilizable.

¿Por qué usar un objeto en lugar de if/else para renderizar componentes? Porque escala mejor: agregar un nuevo caso es una línea, no un bloque condicional, y el código queda más legible.

Habilidades y conceptos que se trabajaron en la clase

Más allá del paso a paso, hay ideas que vale la pena retener para tus próximos proyectos.

  • Importación de SVG como componentes con ReactComponent de Create React App, una sintaxis exclusiva de esa herramienta [10:20].
  • Exports nombrados con alias (as CheckSVG) para evitar colisiones cuando importas archivos con el mismo nombre exportado.
  • Composición de componentes: CompleteIcon y DeleteIcon son envoltorios delgados sobre TodoIcon, lo que centraliza la lógica visual.
  • Props como configuración: pasar type y color permite que un mismo componente cambie de comportamiento sin duplicar código.
  • className dinámico con template literals: combinar clases fijas con valores de props dentro de comillas invertidas.
  • Patrón de objeto-mapa para condicionales: una alternativa limpia al if/else cuando tienes múltiples casos paralelos, técnica vista también en el Curso Práctico de JavaScript [13:50].
  • Limpieza de SVGs antes de importarlos: quitar fill para controlar el color desde React.

¿Vas a usar React Icons o crear tu propia librería de iconos? Cuéntame en los comentarios qué set te gusta más y cómo organizas tus SVGs en proyectos React.