En el mundo del desarrollo de aplicaciones con React, la gestión del estado es un componente esencial, pero a menudo complejo. Aquí es donde entra en juego Zustand, una librería elegante y minimalista para el manejo del estado en React.

Zustand se presenta como una solución ligera y eficaz para el manejo del estado en aplicaciones React, ideal para aquellos que buscan simplicidad sin sacrificar la funcionalidad.

¿Qué es Zustand?

Zustand fue creada con la filosofía de mantener las cosas simples y eficientes. A diferencia de otras soluciones de manejo de estado más robustas (y a veces más complejas) como Redux, Zustand ofrece una API sencilla y directa, facilitando la creación y gestión de estados globales, sin la necesidad de envolver componentes en proveedores de contexto o lidiar con una configuración extensa.

Una de las grandes ventajas de Zustand es su enfoque "hook-centric", ya que utiliza hooks de React, como useStore, para acceder y manipular el estado global. Esto se traduce en un código más limpio y declarativo, fácil de leer y mantener.

Además, Zustand no impone una arquitectura específica, lo que permite a los desarrolladores la flexibilidad de estructurar su estado según las necesidades de tu aplicación.

Principales características

Estas características hacen de Zustand una opción atractiva para desarrolladores que buscan una solución eficiente y fácil de usar para el manejo del estado en sus aplicaciones React.

Instalación

Para testear el funcionamiento de Zustand, vamos a crear un proyecto con React, Vite y TypeScript, aunque la configuración será similar si seleccionamos otro framework o librería como Angular o React.

npm create vite@latest react-zustand-example --  --template react-ts

Para instalar la dependencia de Zustand, ejecutaremos el siguiente comando:

npm install zustand

Configuración

Para configurar Zustand en nuestro proyecto necesitaremos definir nuestro store. Podemos definir tantos stores como queramos, ya que cada uno de ellos puede tener sentido en ciertas partes de nuestra aplicación.

Para definir un store es recomendable utilizar un nuevo fichero. En el siguiente ejemplo vamos a simular el típico contador de incrementar y decrementar que Vite siempre muestra al instalar una nueva aplicación.

Crearemos el fichero counter.store.ts, donde tenemos que diferenciar los siguientes bloques:

// counter.store.ts
import create from 'zustand';

// Definición 
interface UserState {
    count: number;
    increment: () => void;
    decrement: () => void;
}

// Creación
const useCounterStore = create<UserState>((set) => ({
    count: 0,
    increment: () => set((state) => ({ count: state.count + 1 })),
    decrement: () => set((state) => ({ count: state.count - 1 })),
}));

export default useCounterStore;

Como podemos observar, el valor inicial de nuestro contador es cero y los métodos de incrementar y decrementar suman o restan una unidad.

Uso

Una vez definido nuestro store, podemos utilizarlo en cualquiera de nuestras páginas o componentes dentro de nuestra aplicación. Importándolo y extrayendo los atributos o métodos que vamos a utilizar.

// App.tsx

import './App.css'
import useCounterStore from './store/counter.store.ts';

function App() {
  const { count, increment, decrement } = useCounterStore();
  return (
    <>
      <h1>Vite + React + Zustand</h1>
<div>
            Zustand count: {count}
            <button onClick={increment}>Increment store count</button>
            <button onClick={decrement}>Decrement store count</button>
       </div>
    </>
  )
}

export default App

El ejemplo anterior tendría el mismo funcionamiento que un useState definido a nivel de página o componente.

// App.tsx

import './App.css'
import {useState} from "react";

function App() {
    const [count, setCount] = useState(0)
    return (
        <>
            <h1>Vite + React</h1>
            <div>
                useState count: {count}
                <button onClick={() => setCount((count) => count + 1)}>
                    Increment useState count
                </button>
                <button onClick={() => setCount((count) => count - 1)}>
                    Decrement useState count
                </button>
            </div>
        </>
    )
}

export default App

La principal diferencia entre Zustand y useState de React radica en su alcance y enfoque para manejar el estado en aplicaciones.

Zustand proporciona un sistema de gestión de estado centralizado que permite compartir el estado entre múltiples componentes de manera eficiente.

Por otro lado, useState es una característica de React que se utiliza para gestionar el estado local de componentes individuales de manera más simple y directa. Es útil para componentes más simples o cuando el estado no necesita ser compartido entre varios componentes.

¿Cuándo deberíamos utilizarlo?

Llegados a este punto seguro que ya te estás planteando añadir Zustand a tu proyecto, pero antes de nada deberías saber cuándo deberías utilizarlo frente a useState.

Deberías utilizar Zustand:

Deberías utilizar useState:

En resumen, Zustand es más adecuado para aplicaciones grandes y complejas donde se requiere un estado centralizado y un rendimiento optimizado, mientras que useState es más adecuado para componentes simples y pequeños o cuando prefieres una solución nativa de React.

Persistencia de datos

Cuando actualizas la página en tu aplicación web, se produce una recarga completa de nuestra aplicación. Esto significa que todo el estado de la aplicación, incluido el estado manejado por useState, se restablece a su valor inicial.

En Zustand, al igual que useState, el estado también se pierde cuando se actualiza la página. Esto ocurre porque Zustand almacena su estado en la memoria del navegador y, al igual que con useState, este estado se restablece cuando la página se actualiza o se carga nuevamente.

Sin embargo, con Zustand, puedes usar la extensión zustand-persist para solucionar este “problema”, agregar capacidades de persistencia de estado y evitar que el estado se pierda al actualizar la página.

Al persistir el estado con zustand-persist, el estado se guarda en el almacenamiento local del navegador (como localStorage o sessionStorage), lo que permite conservarlo entre las sesiones de navegación.

import { createJSONStorage, persist } from "zustand/middleware";
import create from "zustand";

type UserState =  {
    count: number;
    increment: () => void;
    decrement: () => void;
}

// Envolver el store con persist y definir el estado inicial
export const useUserStore = create(persist<UserState>(
    (set) => ({
        count: 0,
        increment: () => set((userState) => ({ count: userState.count + 1 })),
        decrement: () => set((userState) => ({ count: userState.count - 1 })),
    }),
    // Opciones de persistencia
    {
        name: 'my-app-state',
        storage: createJSONStorage(() => localStorage), // (opcional) valor por defecto 'localStorage'
    },
));

export default useUserStore;

Como podemos ver en el ejemplo anterior, tendremos que realizar varios cambios con relación a la configuración inicial de nuestro store.

Conclusión

El manejo de estados en React se ha simplificado y potenciado gracias a la biblioteca Zustand. A lo largo de este artículo, hemos explorado en detalle qué es Zustand y sus principales características, desde su instalación y configuración hasta su uso en la construcción de aplicaciones React.

Hemos analizado cuándo sería más apropiado emplear Zustand, destacando sus ventajas en escenarios donde se prefiera una solución ligera y fácil de integrar.

Además, hemos abordado la persistencia de datos, mostrando cómo Zustand puede ser combinado con herramientas como zustand-persist para mantener el estado de la aplicación incluso después de que esta se cierre y vuelva a abrir.

En resumen, Zustand se presenta como una opción poderosa y versátil para el manejo de estados en React, ofreciendo una alternativa eficiente y flexible que vale la pena considerar en tus proyectos de desarrollo web.

Cuéntanos qué te parece.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.

Suscríbete

Estamos comprometidos.

Tecnología, personas e impacto positivo.