馃З Manejo de estado global (Context API / Zustand)

Next.js Estado Global

14 - 馃З Manejo de estado global (Context API / Zustand)

Aprende a compartir datos y funciones entre diferentes componentes de tu aplicaci贸n Next.js utilizando Context API (nativa de React) y Zustand (una alternativa ligera y moderna).


馃 ¿Qu茅 es el estado global?

En React, cada componente puede tener su propio estado local mediante useState. Sin embargo, a medida que la aplicaci贸n crece, muchos componentes necesitan compartir informaci贸n com煤n: el usuario actual, el tema (oscuro/claro), o los items del carrito de compras.

Para esto usamos un estado global: un almac茅n centralizado de datos accesible desde cualquier parte de la app.

馃挕 Ejemplo cl谩sico: cambiar el tema de toda la app con un solo bot贸n.

⚙️ Context API — La soluci贸n nativa de React

La Context API permite crear un “contexto” que envuelve a tus componentes y les proporciona datos sin tener que pasar props manualmente en cada nivel.

馃摝 Ejemplo: contador global

// context/ContadorContext.js
"use client";
import { createContext, useContext, useState } from "react";

const ContadorContext = createContext();

export function ContadorProvider({ children }) {
  const [contador, setContador] = useState(0);
  const incrementar = () => setContador(contador + 1);
  const decrementar = () => setContador(contador - 1);

  return (
    <ContadorContext.Provider value={{ contador, incrementar, decrementar }}>
      {children}
    </ContadorContext.Provider>
  );
}

export const useContador = () => useContext(ContadorContext);
      

Y luego lo usamos en dos componentes diferentes:

// app/page.js
"use client";
import { ContadorProvider } from "@/context/ContadorContext";
import ContadorDisplay from "@/components/ContadorDisplay";
import ContadorBotones from "@/components/ContadorBotones";

export default function Home() {
  return (
    <ContadorProvider>
      <main className="p-6 text-center">
        <h1 className="text-2xl font-bold mb-3">馃М Contador Global con Context</h1>
        <ContadorDisplay />
        <ContadorBotones />
      </main>
    </ContadorProvider>
  );
}
      
// components/ContadorDisplay.js
"use client";
import { useContador } from "@/context/ContadorContext";

export default function ContadorDisplay() {
  const { contador } = useContador();
  return <h2 className="text-3xl font-bold mb-2">{contador}</h2>;
}
      
// components/ContadorBotones.js
"use client";
import { useContador } from "@/context/ContadorContext";

export default function ContadorBotones() {
  const { incrementar, decrementar } = useContador();
  return (
    <div className="flex justify-center gap-3">
      <button onClick={decrementar} className="bg-red-500 text-white px-3 py-1 rounded">−</button>
      <button onClick={incrementar} className="bg-green-500 text-white px-3 py-1 rounded">+</button>
    </div>
  );
}
      

馃З Resultado visual:

馃М Contador Global con Context

3

⚠️ Context es ideal para compartir pocos datos (tema, usuario, idioma). Pero puede volverse lento si se usa para estados muy grandes.

⚡ Zustand — Estado global simple y r谩pido

Zustand es una librer铆a ligera (creada por los mismos autores de Jotai y React Three Fiber) que permite manejar el estado global de forma m谩s eficiente y sin tanto boilerplate.

Instalaci贸n:

npm install zustand

馃摝 Ejemplo: contador global con Zustand

// store/useContadorStore.js
"use client";
import { create } from "zustand";

export const useContadorStore = create((set) => ({
  contador: 0,
  incrementar: () => set((state) => ({ contador: state.contador + 1 })),
  decrementar: () => set((state) => ({ contador: state.contador - 1 })),
}));
      

Y luego lo usamos directamente sin Providers:

// app/zustand/page.js
"use client";
import { useContadorStore } from "@/store/useContadorStore";

export default function ZustandPage() {
  const { contador, incrementar, decrementar } = useContadorStore();

  return (
    <main className="text-center p-6">
      <h1 className="text-2xl font-bold mb-3">⚡ Contador con Zustand</h1>
      <h2 className="text-3xl mb-3">{contador}</h2>
      <button onClick={decrementar} className="bg-red-500 text-white px-3 py-1 rounded me-2">−</button>
      <button onClick={incrementar} className="bg-green-500 text-white px-3 py-1 rounded">+</button>
    </main>
  );
}
      
✅ No necesitas Provider ni Context. Los componentes se actualizan autom谩ticamente solo cuando cambian los valores que usan.

馃搳 Comparaci贸n r谩pida

Caracter铆stica Context API Zustand
Instalaci贸n ✅ Nativa ⚙️ Requiere librer铆a
Reactividad Media (re-render general) Alta (renderiza solo lo necesario)
Sintaxis M谩s verbosa Muy concisa
Ideal para Temas, usuario, idioma Estados complejos, apps grandes

✅ Resumen

  • 馃 Context API es la opci贸n nativa para estados simples.
  • Zustand ofrece un enfoque moderno, eficiente y f谩cil de escalar.
  • 馃摝 Ambas pueden convivir en la misma app seg煤n el caso de uso.
  • 馃殌 Entender el estado global es clave para construir apps din谩micas y reactivas en Next.js.

Publicar un comentario

0 Comentarios