Skip to content

Hooks Avanzados en React ​

Los hooks son una de las características más poderosas de React. Además de los hooks básicos como useState y useEffect, React proporciona una variedad de hooks avanzados que permiten manejar aspectos más complejos del estado y la lógica de los componentes.


useEffect: Controlando Efectos Secundarios ​

El hook useEffect se utiliza para manejar efectos secundarios como:

  • Llamadas a APIs.
  • Subscripciones a eventos.
  • Actualizaciones del DOM.

Ejemplo básico ​

jsx
import React, { useEffect, useState } from 'react';

function Timer() {
  const [count, setCount] = useState(0);

  useEffect(() => {
    const timer = setInterval(() => {
      setCount((prevCount) => prevCount + 1);
    }, 1000);

    // Cleanup
    return () => clearInterval(timer);
  }, []);

  return <p>Tiempo: {count}s</p>;
}
  • El array vacío [] asegura que el efecto solo se ejecute una vez al montar el componente.
  • El retorno dentro de useEffect permite limpiar efectos secundarios al desmontar el componente.

useContext: Compartiendo Estado Global ​

El hook useContext se utiliza para acceder al contexto en React sin necesidad de pasar props manualmente por cada nivel del árbol de componentes.

Ejemplo básico ​

jsx
import React, { useContext, createContext } from 'react';

const UserContext = createContext();

function DisplayUser() {
  const user = useContext(UserContext);
  return <p>Usuario: {user}</p>;
}

function App() {
  return (
    <UserContext.Provider value="Juan">
      <DisplayUser />
    </UserContext.Provider>
  );
}
  • createContext define el contexto.
  • UserContext.Provider permite pasar un valor a los componentes hijos.
  • useContext accede al valor sin pasar props explícitas.

useMemo: Optimización de Cálculos Costosos ​

El hook useMemo memoriza valores calculados para evitar cálculos repetitivos innecesarios en cada renderizado.

Ejemplo básico ​

jsx
import React, { useMemo, useState } from 'react';

function ExpensiveCalculation({ num }) {
  console.log('Calculando...');
  return num * 2;
}

function App() {
  const [count, setCount] = useState(0);
  const [number, setNumber] = useState(5);

  const doubled = useMemo(() => ExpensiveCalculation({ num: number }), [number]);

  return (
    <div>
      <p>Resultado: {doubled}</p>
      <button onClick={() => setCount(count + 1)}>Incrementar</button>
    </div>
  );
}
  • Solo recalcula el valor si la dependencia number cambia.
  • Útil para optimizar cálculos costosos o listas filtradas.

useCallback: Memorización de Funciones ​

useCallback se utiliza para memorizar funciones, evitando que se creen nuevas instancias en cada renderizado.

Ejemplo básico ​

jsx
import React, { useCallback, useState } from 'react';

function Button({ onClick }) {
  return <button onClick={onClick}>Haz clic</button>;
}

function App() {
  const [count, setCount] = useState(0);

  const handleClick = useCallback(() => {
    console.log('Clicado');
  }, []);

  return (
    <div>
      <p>Contador: {count}</p>
      <Button onClick={handleClick} />
      <button onClick={() => setCount(count + 1)}>Incrementar</button>
    </div>
  );
}
  • Previene la recreación de la función handleClick a menos que cambien sus dependencias.

useReducer: Estados Complejos ​

useReducer es útil para manejar estados complejos y múltiples transiciones basadas en acciones.

Ejemplo básico ​

jsx
import React, { useReducer } from 'react';

const initialState = { count: 0 };

function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    case 'decrement':
      return { count: state.count - 1 };
    default:
      return state;
  }
}

function Counter() {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <div>
      <p>Contador: {state.count}</p>
      <button onClick={() => dispatch({ type: 'increment' })}>Incrementar</button>
      <button onClick={() => dispatch({ type: 'decrement' })}>Decrementar</button>
    </div>
  );
}

Consejos para trabajar con Hooks Avanzados ​

  1. Usa hooks cuando realmente los necesites: Evita la sobreoptimización prematura.
  2. Mantén las dependencias actualizadas: Siempre define correctamente las dependencias en useEffect, useMemo y useCallback.
  3. Divide la lógica en hooks personalizados: Si un hook se vuelve muy complejo, considera dividirlo.

Conclusiones ​

Los hooks avanzados como useEffect, useContext, useMemo, useCallback y useReducer proporcionan herramientas poderosas para manejar lógica compleja y optimizar el rendimiento en aplicaciones React. Dominar estos hooks mejorará significativamente tus habilidades como desarrollador.