Curso react nivel medio
Introducción
StrictMode es una herramienta de desarrollo en React que te ayuda a identificar problemas potenciales en tu aplicación. Es un componente especial que no se renderiza en la interfaz de usuario, pero realiza comprobaciones adicionales en los componentes hijos para garantizar que sigan las mejores prácticas.
¿Qué es StrictMode?
- Propósito principal: Mejorar la calidad del código asegurando que el comportamiento de los componentes sea seguro y predecible.
- Solo en desarrollo:
StrictModeno afecta al rendimiento en producción.
Cómo Usarlo
StrictMode envuelve partes de tu aplicación para activar sus comprobaciones.
Sintaxis
1import React from "react"; 2import ReactDOM from "react-dom"; 3import App from "./App"; 4 5ReactDOM.createRoot(document.getElementById("root")).render( 6 <React.StrictMode> 7 <App /> 8 </React.StrictMode> 9);
Comportamiento
- Las comprobaciones se aplican a todos los componentes dentro de
<React.StrictMode>. - Puedes envolver toda la aplicación o solo partes específicas.
¿Qué Hace StrictMode?
-
Detecta efectos secundarios peligrosos:
- Verifica el uso correcto de
useEffecty otros hooks. - Llama a funciones de ciclo de vida como
componentDidMountyuseEffectdos veces (en modo desarrollo) para encontrar problemas.
- Verifica el uso correcto de
-
Detecta APIs obsoletas:
- Avisa si estás usando métodos como
componentWillMountocomponentWillReceiveProps, que están obsoletos.
- Avisa si estás usando métodos como
-
Verifica referencias directas al DOM:
- Ayuda a identificar problemas con manipulaciones no seguras del DOM.
-
Detecta actualizaciones de estado inseguras:
- Identifica situaciones donde se realizan actualizaciones de estado en medio de renderizaciones.
Ejemplo Básico
Código
1import React, { useState, useEffect } from "react"; 2 3function ComponenteEjemplo() { 4 const [contador, setContador] = useState(0); 5 6 useEffect(() => { 7 console.log("Efecto ejecutado"); 8 return () => { 9 console.log("Limpieza del efecto"); 10 }; 11 }, []); 12 13 return ( 14 <div> 15 <p>Contador: {contador}</p> 16 <button onClick={() => setContador(contador + 1)}>Incrementar</button> 17 </div> 18 ); 19} 20 21function App() { 22 return ( 23 <React.StrictMode> 24 <ComponenteEjemplo /> 25 </React.StrictMode> 26 ); 27} 28 29export default App;
Salida en Consola (Modo Desarrollo)
Al renderizar el componente:
- El efecto (
useEffect) se ejecuta dos veces. - La función de limpieza del efecto se llama entre renderizados.
Esto ayuda a verificar que el efecto y su limpieza estén implementados correctamente.
¿Qué Cambios Introduce StrictMode?
Re-renderización Doble de Componentes (En Desarrollo)
React.StrictMode monta, desmonta y vuelve a montar los componentes en desarrollo para detectar problemas con:
- Efectos secundarios inesperados.
- Dependencias incorrectas en
useEffect.
Ejemplo de Problema Detectado
1import React, { useState } from "react"; 2 3function ComponenteProblema() { 4 const [contador, setContador] = useState(0); 5 6 // Problema: Esta operación no es segura 7 console.log("Renderizando componente"); 8 if (contador > 3) { 9 setContador(0); // Actualización de estado en medio de un render 10 } 11 12 return <p>Contador: {contador}</p>; 13} 14 15function App() { 16 return ( 17 <React.StrictMode> 18 <ComponenteProblema /> 19 </React.StrictMode> 20 ); 21} 22 23export default App;
Comportamiento
- Sin
StrictMode: El componente podría funcionar incorrectamente sin avisos. - Con
StrictMode: React muestra un error en la consola porque las actualizaciones de estado durante un render no son seguras.
Usos Comunes de StrictMode
-
Comprobación de Hooks Correctos:
- Detecta dependencias faltantes en
useEffect. - Identifica actualizaciones inseguras de estado.
- Detecta dependencias faltantes en
-
Migración a Nuevas APIs:
- Avisa sobre métodos de ciclo de vida obsoletos.
-
Preparación para React Concurrent Mode:
- Garantiza que los componentes sean compatibles con las características más avanzadas de React.
Limitaciones de StrictMode
-
Solo en Desarrollo:
- No afecta la producción, por lo que no impacta al usuario final.
-
Más Renderizaciones:
- Puede causar confusión porque los efectos secundarios se ejecutan varias veces en desarrollo.
-
Solo Comprobaciones, No Errores:
StrictModeno arregla problemas automáticamente; solo te informa para que los soluciones.
Caso Real: Integración con Componentes Externos
Si estás usando una biblioteca que manipula el DOM directamente, StrictMode puede ayudarte a identificar problemas. Por ejemplo:
1import React, { useEffect, useRef } from "react"; 2 3function ComponenteConDOM() { 4 const divRef = useRef(null); 5 6 useEffect(() => { 7 const div = divRef.current; 8 div.textContent = "¡Texto cambiado directamente!"; 9 return () => { 10 div.textContent = ""; // Limpieza 11 }; 12 }, []); 13 14 return <div ref={divRef}>Texto inicial</div>; 15} 16 17function App() { 18 return ( 19 <React.StrictMode> 20 <ComponenteConDOM /> 21 </React.StrictMode> 22 ); 23} 24 25export default App;
Comportamiento
StrictModedesmontará y volverá a montar el componente, asegurándose de que la limpieza del DOM sea correcta.
Conclusión
React.StrictMode es una herramienta valiosa para:
- Garantizar la calidad del código.
- Detectar problemas en efectos secundarios.
- Asegurar que los componentes sigan las mejores prácticas de React.