Ir al contenido principal

Entradas

Mostrando entradas de enero, 2026

Radix UI vs Base UI (shadcn/ui)

  ¿Cómo es eso de que Shadcn/ui se puede utilizar con Radix UI pero también con Base UI? Shadcn/ui ahora permite elegir entre dos librerías de componentes base: Radix UI o Base UI. Ambas ofrecen primitives accesibles y altamente personalizables, pero con diferencias en arquitectura y estilo de implementación. Podés usar cualquiera como base para tus componentes, según tus preferencias. 🔹 ¿Qué son Radix UI y Base UI? Característica Radix UI Base UI Origen Original base de shadcn/ui Alternativa moderna creada por el mismo equipo Estilo de API Usa asChild con Slot Usa render prop con useRender Modularidad Paquetes separados por componente Paquete único @base-ui/react Popularidad Muy extendido en la comunidad React Más nuevo, pero con adopción creciente Migración Fácil gracias a documentación oficial Compatible con shadcn/ui desde diciembre 2025 🔹 ¿Cómo se elige entre Radix y Base UI? Cuando ejecutás: bash npx shadcn-ui@latest init El CLI te pregunta si querés usar Radix UI o Base...

Xdebug y Composer: error de conexión con el cliente de Xdebug

  Al ejecutar el CLI composer run dev, lo primero que aparece es Xdebug: [Step Debug] Could not connect to debugging client. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port). Acto seguido empiezan a correr todos los procesos invocados por Composer, pero después el mismo mensaje de Xdebug aparece periódicamente sin límite. Ese mensaje de Xdebug indica que está intentando iniciar una sesión de depuración pero no encuentra ningún cliente escuchando en el puerto 9003. Aunque no impide que Composer funcione, puede generar ruido constante en la consola. Para solucionarlo, podés desactivar el modo de depuración o configurar correctamente tu cliente (como VS Code o PhpStorm). 🔧 ¿Por qué aparece este mensaje? Xdebug está configurado para iniciar una sesión de step debugging cada vez que se ejecuta PHP. Intenta conectarse a un cliente de depuración (como VS Code o PhpStorm) en localhost:9003 , pero no encuentra ninguno escuchando. Esto suele pasar cuando: No tenés abie...

Shadcn/ui popup dialog

  ¿Tiene shadcn ui algún popup dialog que adentro pueda tener cualquier HTML y JSX? Sí, shadcn/ui incluye un componente de Dialog que funciona como un popup modal y dentro de su contenido ( DialogContent ) podés renderizar cualquier HTML o JSX sin restricciones. Está construido sobre los primitives de Radix UI, lo que garantiza accesibilidad, manejo de foco y soporte para teclado. 🔹 Cómo funciona el Dialog en shadcn/ui Componentes principales : Dialog : contenedor raíz. DialogTrigger : define el elemento que abre el popup. DialogContent : el área del popup donde podés poner cualquier HTML/JSX. DialogHeader , DialogTitle , DialogDescription : opcionales para estructurar el contenido. DialogFooter : opcional para botones de acción. DialogClose : para cerrar el popup. Flexibilidad : Dentro de DialogContent podés incluir formularios, inputs, listas, imágenes, componentes personalizados, incluso otros hooks de React. No hay limitación: es un contenedor React normal. 🔹 Ejemplo prá...

Flujo de datos entre React y React Query

  Quiero visualizar cómo es la interacción entre un componente react que se alimenta de un json, y este que se recarga del back end ante un evento del componente Listo, Gabriel 🙌. Acá tenés una visualización clara del ciclo de interacción entre un componente React y el back end usando JSON como fuente de datos: 🧩 El componente se alimenta de un JSON inicial → renderiza la UI 🖱️ El usuario interactúa (click, teclado, etc.) → se dispara un evento 📡 El componente envía una actualización al back end 📨 El back end responde con un JSON actualizado 🔄 El componente se actualiza y se vuelve a renderizar La imagen ya está generada y lista para ver. ¿Querés que te prepare también un ejemplo en código que refleje este flujo completo, incluyendo el evento, el fetch, y el re-render? Sí. Perfecto, Gabriel 🙌. Acá tenés un ejemplo completo en código que refleja el flujo de interacción entre un componente React, un JSON como fuente de datos, y el back end que responde ante eventos del usuario...

Composición de JSX en React

 ¿Puedo asignar un JSX a una variable y después insertar otro JSX como nodo hijo del JSX que está en dicha variable? Sí, Gabriel 👌. En React podés asignar JSX a una variable, porque JSX al final se compila a llamadas de React.createElement y se comporta como un valor. Lo que no podés hacer es mutar directamente el árbol JSX ya creado (no es un objeto DOM vivo), pero sí podés componer JSX guardado en variables y luego insertarle otros nodos como hijos. 🔹 Ejemplo básico const base = <div className="p-4 bg-gray-100"></div>; export default function App() { return ( <div> {React.cloneElement(base, {}, <p>Este es un hijo insertado</p>)} </div> ); } 👉 Aquí: base es un JSX guardado en una variable. Con React.cloneElement podés añadirle hijos ( <p>...</p> ). 🔹 Ejemplo con múltiples hijos dinámicos const base = <section className="border p-4"></section>; export default function App() { ...

useState vs useRef vs variables globales

  Si un componente de React tiene un useState que no se usa para el renderizado ¿Hay que trasladar el useState a una variable global? Muy buena observación, Gabriel 👌. La respuesta corta es: no necesariamente . Depende de qué propósito tenga ese useState . 🔹 Cómo funciona useState Cada vez que llamás a setState , React vuelve a renderizar el componente si ese estado se usa en el JSX . Si el estado no afecta el renderizado , igual se guarda en la memoria interna del componente, pero no genera cambios visibles. 🔹 Casos donde NO hace falta trasladarlo a global Si el estado es temporal o local (ej. un contador interno, un flag de validación, un índice de iteración). Si solo lo usa ese componente y no importa fuera de él. 👉 En ese caso, podés dejarlo como useState aunque no se refleje en el JSX. 🔹 Casos donde SÍ conviene moverlo Si el estado debe sobrevivir entre cambios de página o desmontajes del componente . Si varios componentes distintos necesitan acceder al mismo valor....

Código limpio para crear diferentes objetos JSX dependiendo de un discriminante

  ¿Cómo puedo organizar mejor un código que se ocupa de la creación de muchos objetos basado en la concatenación de varios operadores ?: (ternary operator) evaluando un discriminante y creando uno u otro objeto según el discriminante? Muy buena pregunta, Gabriel 👌. Cuando el código empieza a tener muchos operadores ternarios concatenados para decidir qué objeto crear, la legibilidad y el mantenimiento se vuelven un problema. Hay varias formas más limpias y escalables de organizarlo: 🔹 1. Usar un mapa de discriminantes a constructores En vez de encadenar ternarios, podés definir un objeto/diccionario que mapea el discriminante a la función creadora: ts type Discriminante = "A" | "B" | "C"; const factories: Record<Discriminante, () => Objeto> = { A: () => new ObjetoA(), B: () => new ObjetoB(), C: () => new ObjetoC(), }; function crearObjeto(tipo: Discriminante): Objeto { return factories[tipo](); } 👉 Ventaja: agregar un nuevo t...