Saltar al contenido principal

Uso en Componentes

Esta documentación explica cómo utilizar el store de Zustand en los componentes de React.

Importación básica

import { useAppStore } from '@/stores/app-store';

Obtener valores del estado

Hay dos formas principales de obtener valores del estado:

1. Selección directa

const Component = () => {
const cart = useAppStore(state => state.cart);
const isLoggedUser = useAppStore(state => state.isLoggedUser);

return (
<div>
{isLoggedUser ? 'Usuario logueado' : 'Usuario invitado'}
{cart && <p>Tienes {cart.items.length} productos en tu carrito</p>}
</div>
);
};

2. Múltiples selectores

const Component = () => {
const {
cart,
isLoggedUser,
getCart
} = useAppStore(state => ({
cart: state.cart,
isLoggedUser: state.isLoggedUser,
getCart: state.getCart
}));

return (
<div>
{/* Uso de los valores seleccionados */}
</div>
);
};

Uso de acciones

Las acciones se pueden obtener igual que los valores del estado:

const Component = () => {
const addProduct = useAppStore(state => state.addProduct);

const handleAddToCart = async () => {
await addProduct('SKU123', 1, { isArmed: true });
};

return (
<button onClick={handleAddToCart}>
Añadir al carrito
</button>
);
};

Ejemplo real: Página de categoría

const CategoryPage = (props) => {
const setCurrentCategory = useAppStore(state => state.setCurrentCategory);
const setTagPromotions = useAppStore(state => state.setTagPromotions);

const {
category,
tagPromotions,
} = props;

// Actualizamos el estado con los datos de la página
setCurrentCategory(category);
setTagPromotions(tagPromotions);

return (
// Contenido de la página
);
};

Optimización del rendimiento

Para evitar renders innecesarios, es importante seleccionar sólo los valores que realmente necesita el componente:

❌ Mal (causa re-renders innecesarios)

const entireState = useAppStore();
const { cart } = entireState;

✅ Bien (solo re-renderiza cuando cart cambia)

const cart = useAppStore(state => state.cart);

Acciones asíncronas

Para acciones asíncronas, como cargar datos del carrito:

const Component = () => {
const getCart = useAppStore(state => state.getCart);
const cart = useAppStore(state => state.cart);

useEffect(() => {
// Cargamos el carrito al montar el componente
getCart();
}, [getCart]);

return (
// Renderizado con los datos del carrito
);
};