En la gestión de aplicaciones web, el manejo del estado global es un pilar fundamental para proporcionar una experiencia de usuario fluida y consistente. Este tema es especialmente crítico cuando toca el ámbito del carrito de compras, un componente vital de cualquier e-commerce. Exploraremos cómo resolver los desafíos inherentes a esta tarea a través de un enfoque moderno y eficiente, utilizando Sustant, un manejador de estado que promete mantener el rendimiento optimizado en aplicaciones creadas con Next.js 13 en adelante.
¿Cuál es el desafío del manejo de estado en un carrito de compras?
El manejo de estado en un carrito de compras online representa un reto ya que los cambios en él deben reflejarse en diferentes componentes distribuidos a lo largo de la aplicación. Imaginemos que agregamos un coche volador desde la página de producto y esperamos que esta información se actualice de inmediato en el carrito de compras ubicado, por lo general, en el header del sitio.
¿Por qué es problemático un estado global en aplicaciones web?
Las soluciones más comunes para manejar un estado global, como Redux o Context, requieren el uso de un provider para pasar el estado. Esto, en consecuencia, puede impactar el desempeño de la aplicación, obligando al uso exclusivo de componentes cliente (use client) y necesitando, muchas veces, una reestructuración grande de las peticiones existentes.
¿Qué es Sustant y cómo resuelve estos problemas?
Sustant es una librería de manejo de estado diseñada para aplicaciones que usan Next.js 13 o superior. Actúa creando una pequeña tienda que funciona como hook, permitiéndonos agregar el estado y las funciones para actualizar dicho estado sin afectar negativamente el rendimiento de la aplicación.
Implementando un estado global con Sustant
Voy a mostrarte paso a paso cómo implementar un estado global utilizando Sustant en tu proyecto:
Para comenzar, debes agregar Sustant como una dependencia en tu proyecto y definir un tipo global, como cartItem, que usarás en tu carrito.
Crea un nuevo archivo en tu carpeta de hooks y establece allí tu tienda utilizando Sustant.
importcreatefrom'zustand';const useStore =create((set)=>({ cart:[],// Aquí va tu estado inicial, por ejemplo, un arreglo para el carrito.addToCart:(item)=>set((state)=>({ cart:[...state.cart, item]})),// Aquí agregas funciones para actualizar el estado.}));
¿Cómo se implementa Sustant en el flujo de nuestra aplicación?
Una vez que hayas creado tu tienda con Sustant, puedes implementar la función addToCart en tus componentes. Por ejemplo, en tu vista de producto, al hacer clic en "añadir al carrito", debes manejar el evento y actualizar tu estado global pasando el producto al hook useStore. De esta forma, cada vez que un usuario agregue un nuevo producto, la información se reflejará en todo el carrito.
¿Qué beneficios aporta Sustant al desempeño y la escalabilidad?
Sustant se destaca al permitir una gestión de estado global sin interferencias en componentes del lado del servidor. Aplica el estado global y sus funciones en componentes cliente requeridos mediante un sencillo hook. Este enfoque evita sobrecargar la aplicación y mantiene un rendimiento ágil y eficaz, algo crítico para la escalabilidad y la experiencia del usuario.
La clave de cualquier proceso de aprendizaje es la práctica constante y el enfrentamiento de retos reales. Te invito a explorar las capacidades de Sustant en tu propio proyecto Next.js y ver por ti mismo cómo puede ayudarte a mantener un estado global eficiente y performante. ¡Adelante con esa implementación!
Alguien sabe como puedo prevenir que el usario manipule el estado?
Localstorage se puede editar supongamos que el precio de mi item es de 300, pero se puede manipular para cambiar el precio como podemos evitar esto para no enviar un precio o total incorrecto para procesar el pago ?
Creo que ese tipo de validación no se hace sobre el front, precisamente para evitar este que el ususario tenga la posibilidad de manipular esa información.
En otros proyectos donde no he tendio aconsumiendo una api ajena, lo que hago es que guardo en una const el resultado de la consulta a la API (esta const la he guardado incluso en un estado), muestro en pantalla la info del producto y cuando el usuario hace el proceso de compra, solo tomo el id del producto y la cantidad, el resto de la información (principalmente el precio por unidad) del pedido la sigo obteniendo de esa información consultada ya previamente guardada
Supongo que habra que hacer una funcion de intermediario para que encripte el estado en localstorage y lo desencripte al leerlo, pero que cada vez que valla a actualizar en localstorage cambie su hash, es lo que se me ocurre
De que forma se debe utilizar Zustand y SSR en una app de NextJS?
Con Redux es posible inyectar el estado a través del Window e hidratar del lado de cliente. Hay alguna opción para hacer algo parecido con Zustand? es necesario? en su documentación recomiendan usar useEffect dentro de un book useStore y luego pasar la store como argumento, sin embargo esto desactivaría la inicialización del store del lado del servidor o no?
Este tutorial me ayudo. Basicamente se puede recibir las propiedades como Props en el RootLayout y luego injectarlas en un componente StoreInitializer el cual solo sera declarado como un client componente 'use client'
en los componentes SSR se accede con la propiedad getState() del store y luego en los client components a través de los selectores de Zustand
Me esta pasando que al subir el contador a 3 por ejemplo, agrego al carro, solo me agrega uno, no me sale 3... a alguien mas le pasa?
Platiz, por favor pongan una opción de Blogs ....porque esta sección de comentarios y preguntas le queda corta a algunas personas.
¿Qué otras alternativas hay como zustand para manejar el estado en next y que no interfieran con los server components?
Redux o un Context son alternativas mencionadas para manejar el estado, pero necesitan un provider y pueden afectar el performance.
yo eh usado Recoil y me a ido muy bien, incluso esta mas optimizado que muchos otros
Al utilizar custom hooks, es probable que ese componente y sus hijos se vuelvan de tipo cliente.
La ventaja de Zustand NO ES evitar que los componentes se vuelvan de tipo cliente.
<!---->
La ventaja de Zustand ES que me evita envolver la aplicación con un Provider (volviendo toda la aplicación de tipo cliente).
Con Zustand solamente debo utilizar el hook donde necesite el store global y así convertir solo esos componentes en tipo cliente, manteniendo los demás como ServerComponents con todas sus ventajas.
Por si alguien esta interesado, estoy llevando el curso en paralelo a que le aplico Arquitectura Hexagonal al proyecto.
les dejo el link del Repo si quieren darle un ojo
Todo esta en la rama develop
En mi caso tengo una app, con módulos y cada modulo tiene distintos permisos para cada usuario, si en cada pagina que abre el usuario, primero debe chequear a zustand si tiene permisos ... estaría con toda mi app en modo client, osea que no puedo aprovechar para nada el lado del servidor, hay forma de tomar un enfoque distinto ??