Mejores Prácticas de Patrones React
Un resumen condensado de las 25 mejores prácticas más importantes extraídas de todas las páginas de esta sección.
Busca en todas las páginas de la documentación
Un resumen condensado de las 25 mejores prácticas más importantes extraídas de todas las páginas de esta sección.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
children para diseños multi-región pierde el control de colocación; expone props nombrados de ReactNode - ({ header, sidebar, footer }: { header: ReactNode; sidebar: ReactNode; footer: ReactNode }) - para que los consumidores puedan llenar cada slot independientemente y mantengas TypeScript de su lado.ReactNode acepta strings/null/arrays (mejor para slots y children), ReactElement se reduce a un único elemento JSX, y ComponentType<P> es un componente que puedes instanciar - elige intencionadamente porque escriben estilos de composición diferentes.Root.Item, Root.Trigger y Root.Content funcionen a cualquier profundidad JSX - protege el hook del consumidor con un error lanzado cuando se usa fuera de la raíz en lugar de devolver un null silencioso.createContext y useState, por lo que el archivo raíz debe ser un Client Component en Next.js - y usa un context de dos niveles (AccordionContext + ItemContext por elemento) para limitar la identidad a cada elemento.dispatch de useReducer ya es estable en React y no necesita memoización adicional.value del context en cada renderizado padre anula la memoización y re-renderiza cada consumidor; envuelve el valor en useMemo con clave en el estado real, o divide contexts para que los consumidores solo actualizadores sean inmunes.value !== undefined y retroceder al estado interno - const [inner, setInner] = useState(defaultValue); const val = value !== undefined ? value : inner - envuelve la decisión en un hook reutilizable useControllableState y nunca cambies modos después del montaje.onChange que establece estado congela la entrada porque el valor del DOM se queda atrás del usuario; desacelera efectos secundarios (búsqueda, autosave) mientras siempre actualizas el estado controlado sincronamente.getDerivedStateFromError (derivación de estado de fase de renderizado puro) para el cambio de fallback e componentDidCatch (post-commit) para registrar en Sentry; no hay equivalente de hook, así que usa una clase o react-error-boundary.resetKeys para que el límite se recupere automáticamente cuando cambie un parámetro de ruta, y pon una key en los hijos del límite para que limpiar hasError fuerce un remontaje - simplemente restablecer el estado deja el subtree en su estado corrupto.try/catch explícito, y en Next.js confía en la convención de nivel de ruta error.tsx con error.digest para errores del servidor.withAuth(Component) dentro del cuerpo de otro componente crea un tipo de componente completamente nuevo en cada renderizado y destruye estado; aplica HOCs una vez en el alcance del módulo - const ProtectedPage = withAuth(DashboardPage) - y siempre establece un displayName significativo.React.forwardRef internamente y copia estáticos con hoist-non-react-statics - de lo contrario, los consumidores pierden mangos imperativos y constantes adjuntas.memo/useMemo/useCallback prematuro agrega sobrecarga de comparación que puede ralentizar componentes rápidos; usa el Profiler de React DevTools para identificar puntos calientes reales y recuerda que onClick={() => …} o style={{…}} en línea anula memo mediante referencias frescas.useTransition cuando eres dueño del establecedor de estado y quieres marcar la actualización como no urgente; usa useDeferredValue para retrasar un valor que recibes como prop, y compáralo con el valor actual para mostrar un indicador de obsoleto sutil.memo - llega a react-virtual/react-window o CSS content-visibility: auto, y mantén keys estables (IDs, no índices) para que las filas no se remunten al desplazarse.stopPropagation cuando necesites un corte limpio, y atrapa el enfoque además de guardarlo/restaurarlo para modales reales.document.body bloquea el renderizado del servidor, así que cierra el portal con una bandera mounted establecida por useEffect - const [mounted, setMounted] = useState(false); useEffect(() => setMounted(true), []) - o marca el componente como "use client" en Next.js, y crea un nodo de contenedor dedicado en lugar de amontonar divs vacíos en body.children={(state) => <X />} en línea crea una referencia de función nueva en cada renderizado e interrumpe React.memo en el padre; eleva la función o acepta que memo no se aplicará aquí, y recuerda que los hooks no pueden ser llamados dentro de una función render-prop.<button {...triggerProps}>Open</button> <div {...contentProps}>…</div> - los consumidores no pueden olvidar el cableado de accesibilidad porque se envía con la colección.isLoading/isError/hasData con un único status de unión etiquetada para que combinaciones imposibles sean irreproducibles; cada estado lleva solo los datos válidos para ese estado.return state para eventos desconocidos para que transiciones no manejadas no produzcan undefined.use(promise) trata una nueva referencia como una nueva solicitud pendiente; eleva la creación de promesas a un padre, un caché o un manejador de eventos.useTransition cuando reemplazas la interfaz de usuario impulsada por Suspense para que las búsquedas rápidas no destelleen un esqueleto, y anida límites para que el contenido secundario se transmita después del shell crítico.Revisado por Chris St. John·Última actualización: 16 jul 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥