martes, 4 de noviembre de 2025

SVG como suma de componentes React

 ¿See pueden encapsular fragmentos de SVG en componentes react y construir un SVG complejo uniendo estos componentes?


¡Definitivamente sí! Esta es una de las mejores prácticas al trabajar con gráficos complejos en React, como tu Odontograma.

El poder de React para manejar componentes se extiende perfectamente al SVG. Puedes encapsular cualquier fragmento de código SVG (desde una forma simple hasta un grupo entero de elementos) dentro de un componente de React.

Aquí te explico por qué es la técnica correcta y cómo se vería la estructura en tu proyecto.


El Principio: SVG como JSX

En React, el código SVG se escribe directamente dentro del método return de tu componente (JSX), lo que significa que el SVG se comporta como cualquier otro elemento HTML/JSX:

1. Componente Atómico: <Superficie />

En lugar de tener 5 polígonos dentro de cada diente, creas un componente para la superficie.

JavaScript
// src/components/Superficie.jsx
const Superficie = ({ id, puntos, estado }) => {
  const color = estado === 'Caries' ? 'fill-red-600' : 'fill-gray-300';
  
  return (
    <polygon
      id={id}
      points={puntos}
      className={`stroke-gray-800 stroke-1 cursor-pointer transition-colors ${color}`}
      // Manejo de eventos encapsulado
      onClick={() => console.log(`Clic en ${id}`)}
    />
  );
};

2. Componente Molécula: <Diente />

El componente <Diente> utiliza el componente <Superficie /> cinco veces, y se encarga de posicionar y rotar el diente completo.

JavaScript
// src/components/Diente.jsx
const Diente = ({ numero, datosPlan }) => {
  // Los datos de posicionamiento y las coordenadas de los polígonos
  const { x, y, rotacion, formas } = obtenerGeometria(numero);

  return (
    <g 
      id={`tooth-${numero}`} 
      transform={`translate(${x} ${y}) rotate(${rotacion})`}
    >
      {/* Cinco instancias de la Superficie */}
      <Superficie id="S_O" puntos={formas.oclusal} estado={datosPlan.oclusal.problema} />
      <Superficie id="S_D" puntos={formas.distal} estado={datosPlan.distal.problema} />
      {/* ... otras superficies ... */}
      
      {/* También puedes agregar el texto del número aquí */}
      <text x="0" y="30" textAnchor="middle">{numero}</text>
    </g>
  );
};

3. Componente Organismo: <Odontograma />

El componente principal simplemente ensambla los 32 dientes.

JavaScript
// src/components/Odontograma.jsx (El componente principal)
const Odontograma = () => {
    // Imagina un array de 32 objetos con los datos de cada diente
    const planDental = usarPlanDental(); // Hook que trae los datos de Firestore

    return (
        <svg width="1000" height="500">
            {planDental.map((diente) => (
                <Diente 
                    key={diente.numero}
                    numero={diente.numero}
                    datosPlan={diente.data}
                />
            ))}
        </svg>
    );
};

Ventajas de Encapsular SVG en Componentes React

  1. Reutilización: Defines el código de un diente una sola vez y lo utilizas 32 veces, simplemente cambiando sus props (número, coordenadas, rotación, datos clínicos).

  2. Mantenimiento Sencillo: Si necesitas cambiar el color del borde de un diente, lo cambias en un solo lugar: el componente <Superficie />.

  3. Lógica Localizada: La lógica de qué color debe tener una superficie (isCaries ? 'red' : 'gray') reside solo dentro del componente que la renderiza. Esto hace que el código sea predecible y fácil de depurar.

  4. Rendimiento: React se encarga de que solo se re-renderice el componente <Diente /> cuyos datos han cambiado, no todo el SVG.

Esta es la forma más profesional y escalable de construir tu odontograma en React.

No hay comentarios: