Ir al contenido principal

Mantener el estado entre páginas en React

 ¿Es verdad que en React existe un hook de estado global que sirve para mantener el estado entre cambios de página?

Muy buena observación, Gabriel 👌. La respuesta corta es: React no trae un hook de estado global por defecto. Los hooks nativos (useState, useReducer, useEffect, etc.) manejan estado local al componente. Si cambiás de página (por ejemplo, con React Router), ese estado se pierde porque el componente se desmonta.

🔹 Entonces, ¿cómo se logra un estado global en React?

React ofrece varias formas de compartir estado entre páginas o componentes:

  1. Context API (useContext)

    • Es lo más cercano a un “estado global” nativo.

    • Podés crear un Context y envolver tu aplicación en un Provider.

    • Ejemplo:

      jsx
      const AuthContext = React.createContext();
      
      function AuthProvider({ children }) {
        const [user, setUser] = React.useState(null);
        return (
          <AuthContext.Provider value={{ user, setUser }}>
            {children}
          </AuthContext.Provider>
        );
      }
      
      function useAuth() {
        return React.useContext(AuthContext);
      }
      

    👉 Con esto, cualquier componente (en cualquier página) puede acceder a user y setUser.

  1. Librerías de estado global

    • Redux: clásico, muy usado en proyectos grandes.

    • Zustand: más ligero y moderno, con API simple basada en hooks.

    • Jotai / Recoil: alternativas más declarativas y reactivas. 👉 Estas librerías permiten mantener estado global persistente entre páginas sin necesidad de pasar props.

  1. Persistencia en almacenamiento

    • Si querés que el estado sobreviva incluso a un refresh, podés sincronizarlo con localStorage o sessionStorage.

    • Ejemplo:

      jsx
      const [theme, setTheme] = React.useState(
        () => localStorage.getItem("theme") || "light"
      );
      
      React.useEffect(() => {
        localStorage.setItem("theme", theme);
      }, [theme]);
      

🔹 Conclusión

  • No existe un hook nativo de estado global en React.

  • Lo más cercano es Context API (useContext + useState/useReducer).

  • Para proyectos grandes o complejos, conviene usar librerías como Redux, Zustand o Recoil.

  • Si querés persistencia entre refreshes, combinás estado global con localStorage.

✨ En resumen: React te da las piezas (useContext, useReducer), pero el “estado global” lo tenés que armar vos o usar una librería.

¿Querés que te arme un ejemplo práctico con Zustand para que veas cómo se maneja un estado global con un hook súper simple y usable en cualquier página?

Comentarios

Entradas populares de este blog

Crear proyecto de frontend con Vite, React, Tailwind, Typescript y JSX

 ¿Cómo se crea un proyecto exclusivo de frontend con Vite, React, Tailwind, Typescript y JSX? ¡Absolutamente! Entiendo que quieres la guía completa para pasar de cero a tener un proyecto de frontend moderno, vacío y listo para ser llenado con tu código. A continuación, te proporciono un archivo de guía detallada que incluye todos los comandos necesarios para inicializar el proyecto, configurar Tailwind CSS, y los pasos clave para empezar a "poblarlo". Voy a generar un documento Markdown con la guía paso a paso, incluyendo los comandos de terminal y las modificaciones esenciales a los archivos de configuración. Guía: Creación de un Proyecto Frontend Puro (Vite, React, TypeScript, Tailwind) Este documento detalla el proceso para inicializar un proyecto de frontend vacío y optimizado, utilizando Vite como empaquetador, React como librería, TypeScript para tipado y Tailwind CSS para estilizado. 1. Inicialización del Proyecto con Vite Vite es la herramienta más rápida para emp...

Tokens V2

Tokens: Programme to discover tokens, where there are not. Now available at  https://puszcza.gnu.org.ua/projects/tokens/ This is Version 2, for  version 1, go here . Synopsis: use TokensV2; sub printFile; my @FORMAT = ( ['<Message Date=".*?" Time=".*?" DateTime=".*?" SessionID=".*?"><From>(?:<User FriendlyName=".*?"/>)+</From><To>(?:<User FriendlyName=".*?"/>)+</To><Text(?: Style=".*?")?>.*?</Text></Message>',   sub {     my $fh = $_[1];     my ($d, $t, $f, $s, $T) = $_[0] =~ m|<Message Date="(.*?)" Time="(.*?)" DateTime=".*?" SessionID=".*?">(<From>(?:<User FriendlyName=".*?"/>)+</From>)<To>(?:<User FriendlyName=".*?"/>)+</To><Text(?: Style="(.*?)")?>(.*?)</Text></Message>|;     my $F = join '<br />', ...

Perl Net::LDAP::SimpleServer

Adaptaciones sobre el módulo LDAP Server para Windows (Strawberry Perl) Lista de adaptaciones (continúa más abajo): - Relajación de condiciones de bind:     - Cuenta principal (principal account)     - Validación de contraseñas Ubicación del archivo: %Strawberry_Perl%\site\lib\net\ldap\SimpleServer\ProtocolHandler.pm CPAN: http://search.cpan.org/~russoz/Net-LDAP-SimpleServer-0.0.17/lib/Net/LDAP/SimpleServer.pm Código: package Net::LDAP::SimpleServer::ProtocolHandler; use strict; use warnings; # ABSTRACT: LDAP protocol handler used with Net::LDAP::SimpleServer our $VERSION = '0.0.17';    # VERSION use Net::LDAP::Server; use base 'Net::LDAP::Server'; use fields qw(store root_dn root_pw allow_anon); use Carp; use Net::LDAP::LDIF; use Net::LDAP::Util qw{canonical_dn}; use Net::LDAP::FilterMatch; use Net::LDAP::Constant (     qw/LDAP_SUCCESS LDAP_AUTH_UNKNOWN LDAP_INVALID_CREDENTIALS/,   ...