React
Hooks
Desenvolvimento
JavaScript
React19

Explorando los ganchos de React y las innovaciones de React 19

Explorando los ganchos de React y las innovaciones de React 19

Hooks revolucionó el desarrollo de React al permitir que los componentes funcionales administren con elegancia el estado, los efectos secundarios y la lógica compleja. Con React 19, se introdujeron nuevos ganchos para optimizar aún más el flujo de trabajo. En este artículo, exploraremos los ganchos clásicos, los ganchos avanzados y las novedades de la versión 19 con ejemplos prácticos.


Ganchos de reacción básicos

useState: Gestión de estado simple

Gestiona estados locales en componentes funcionales. Ideal para valores que cambian con el tiempo.

Ejemplo: contador interactivo

importar {useState} desde 'reaccionar';

función Contador() { const [recuento, setCount] = useState(0);

regresar (

Hiciste clic {count} veces

<botón onClick={() => setCount(cuenta + 1)}> incremento </botón>
); }


useEffect: efectos secundarios

Ejecuta código después de la renderización, como llamadas API o manipulación DOM.

Ejemplo: Obteniendo datos de una API

importar {useState, useEffect} de 'reaccionar';

función Lista de usuarios() { const [usuarios, setUsers] = useState([]);

utilizarEfecto(() => { buscar ('https://api.example.com/usuarios') .entonces(respuesta => respuesta.json()) .then(datos => setUsers(datos)); }, []); // Ejecutar solo una vez

regresar (

    {usuarios.map(usuario => (
  • {user.name}
  • ))}
); }


useContext: intercambio de estado global

Accede a valores de contexto sin necesidad de profundizar.

Ejemplo: Tema oscuro/claro

importar {createContext, useContext, useState} desde 'reaccionar';

const ThemeContext = crearContext();

función aplicación() { const [tema, setTheme] = useState('luz');

regresar ( <ThemeContext.Valor del proveedor=> </ThemeContext.Provider> ); }

función barra de herramientas() { const {tema, setTheme} = useContext(ThemeContext);

regresar ( <botón onClick={() => setTheme(tema === 'claro'? 'oscuro': 'claro')}> ¿Cambiar al tema {tema === 'luz'? 'oscuro': 'claro'} </botón> ); }


useRef: Referencias mutables

Almacena valores que persisten entre renderizaciones sin provocar nuevas renderizaciones.

Ejemplo: centrarse en la entrada

importar {useRef} desde 'reaccionar';

función Entrada de texto() { const inputRef = useRef(nulo);

entrada de enfoque constante = () => { inputRef.current.focus(); };

regresar (

); }


Ganchos avanzados y personalizados

useReducer: Estado complejo

Gestiona estados con una lógica más elaborada, similar a Redux.

Ejemplo: Lista de tareas

importar {useReducer} desde 'reaccionar';

function todosReducer(estado, acción) { cambiar (tipo.acción) { caso 'ADD_TODO': return [...estado, {texto: acción.texto, completado: falso}]; caso 'TOGGLE_TODO': devolver estado.map((todo, índice) => índice === acción.index? { ...todo, completado: !todo.completado } : todo ); predeterminado: estado de retorno; } }

función TodoApp() { const [todos, despacho] = useReducer(todosReducer, []);

const handleSubmit = (e) => { e.preventDefault(); despacho({ tipo: 'ADD_TODO', texto: e.target.elements.todo.value }); e.objetivo.reset(); };

regresar (

<botón tipo="enviar">Agregar</botón> {todos.map((todo, índice) => ( < clave = {índice} onClick={() => despacho({ tipo: 'TOGGLE_TODO', índice })} estilo = {decoración de texto: todo.completado? 'line-through': 'ninguno'} > {todo.texto}
))} ); }


useMemo y useCallback: optimización del rendimiento

  • useMemo: Memoriza los valores calculados.
  • useCallback: Memoriza funciones.

Ejemplo: Cálculo pesado

importar {useMemo, useState} desde 'reaccionar';

función ComponenteCaro({ lista }) { const listaclasificada = useMemo(() => { console.log('Lista de pedidos...'); return [...lista].sort(); }, [lista]);

return

{sortedList.join(', ')}
; }


Ganchos personalizados: reutilización de lógica

Ejemplo: useFetch para solicitudes HTTP

importar {useState, useEffect} de 'reaccionar';

función useFetch(url) { const [datos, setData] = useState(nulo); const [cargando, setLoading] = useState(true);

utilizarEfecto(() => { buscar (url) .entonces(res => res.json()) .entonces(datos => { establecerDatos(fecha); setLoading(falso); }); }, [URL]);

devolver {datos, cargando}; }

// Uso en el componente: función Perfil de usuario ({ ID de usuario }) { const {datos: usuario, cargando} = useFetch(https://api.example.com/users/${userId});

if (cargando) return

Cargando...
; devolver
{nombre.usuario}
; }


Nuevos ganchos de React 19

useOptimistic: Actualizaciones optimistas

Actualiza la interfaz de usuario antes de la confirmación del servidor y se revierte en caso de falla.

Ejemplo: adición de comentarios optimistas

importar {useOptimistic} desde 'reaccionar';

función Formulario de comentario({ onSubmit }) { const [comentarios optimistas, agregar comentario optimista] = useOptimistic( [], (estado, nuevo comentario) => [... estado, {texto: nuevo comentario, enviando: verdadero}] );

const handleSubmit = async (e) => { e.preventDefault(); const formData = nuevo FormData(e.target); comentario constante = formData.get('comentario');

addOptimisticComment(comentario);

prueba {
  esperar al enviar (comentario);
} captura (error) {
  // Revertir la interfaz de usuario si la solicitud falla
}

};

regresar (

<botón tipo="enviar">Enviar</botón> {optimisticComments.map((comentario, índice) => ( <div style=> {comentario.texto}
))} ); }


useResource: Integración con Suspense

Gestiona datos asincrónicos de forma declarativa.

Ejemplo: carga de datos con respaldo

importar {useResource, Suspense} desde 'reaccionar';

función buscarUsuario(id) { // Devuelve una promesa }

función Perfil de usuario ({ ID de usuario }) { const userResource = useResource(() => fetchUser(userId));

devolver

{userResource.read().name}
; }

// Uso en el componente principal: <Suspense fallback={

Cargando usuario...
}>


useEventListener: detectores de eventos simplificados

Gestiona los oyentes de eventos de forma limpia.

Ejemplo: Monitorear el tamaño de la ventana

importar {useEventListener} desde 'reaccionar';

función Tamaño de ventana() { const [tamaño, setSize] = useState({ ancho: ventana.innerWidth, alto: ventana.innerHeight });

useEventListener('cambiar tamaño', () => { setSize({ ancho: ventana.innerWidth, alto: ventana.innerHeight }); });

return

Tamaño de la ventana: {size.width}x{size.height}
; }


useMediaQuery: Diseño Responsivo

Reacciona a los cambios en las consultas de los medios.

Ejemplo: Tema oscuro con preferencia del sistema

importar {useMediaQuery} desde 'reaccionar';

función DarkModeToggle() { const prefiereDark = useMediaQuery('(prefiere-color-esquema: oscuro)'); const [isDark, setIsDark] = useState(prefiereDark);

// Actualiza el tema del sitio aquí...

regresar ( <botón onClick={() => setIsDark(!isDark)}> {¿Está oscuro? 'Desactivar modo oscuro' : 'Activar modo oscuro'} </botón> ); }


useErrorBoundary: Manejo elegante de errores

Detecta errores en componentes secundarios.

Ejemplo: Umbral de error personalizado

importar {useErrorBoundary} desde 'reaccionar';

función ErrorProneComponent() { const {LímiteError, didCatch, error} = useLímiteError();

volver didCatch? (

Se produjo un error: {error.message}
): ( <Límite de error> ); }


Conclusión

Los ganchos de React continúan evolucionando y brindan herramientas poderosas para simplificar el desarrollo. Con React 19, funciones como useOptimistic y useResource mejoran la experiencia del usuario al manejar operaciones asincrónicas con fluidez, mientras que ganchos como useMediaQuery y useEventListener facilitan la creación de interfaces adaptables.

Al dominar estos ganchos, desde lo básico hasta lo último, estará equipado para crear aplicaciones más sólidas, eficaces y más fáciles de mantener. ¡Intenta integrar estas técnicas en tus proyectos y observa cómo transforman tu flujo de trabajo! 🚀

Lea también