Cómo implementar NGXS en tu proyecto Angular

Hola a todos, hoy os voy a explicar como funciona NGXS en angular.

NGXS es una state management para aplicaciones Angular. Nos permite gestionar el estado de una aplicación, centralizando el estado pudiendo realizar cambios de manera controlada.

Esta basado en el patrón Flux que se utiliza para gestionar el estado de una aplicación en un flujo unidireccional.

Pero en NGXS se simplifica, sin necesidad de pasar por la vista.

Partes de NGXS Store

  • Estado: es una representación inmutable de toda la información relevante de la aplicación en un momento dado.
  • Store: contiene el estado de la aplicación y nos permite actualizar y recuperar esos estados.
  • Actions: se usan para actualizar el estado y enviarlo a la store usando dispatch
  • Clases State: clases que representan el estado de la aplicación donde actúa el store.
  • Selectors: métodos para obtener una parte especifica del estado de la aplicación, permitiendo estar al tanto de las actualizaciones de ese estado.

Beneficios

  1. Centralización del estado: centraliza el estado de la aplicación en un solo lugar, facilitando la comprensión y el mantenimiento de la aplicación.
  2. Flujo unidireccional: utiliza el patrón de diseño Flux para gestionar el estado de la aplicación en un flujo unidireccional, haciendo que sea más predecible y fácil de depurar.
  3. Inmutabilidad del estado: se utilizan técnicas de inmutabilidad del estado para garantizar que no se modifique directamente, lo que previene errores y hace que la aplicación sea más robusta.
  4. Reducción de la complejidad: reduce la complejidad de la lógica de la aplicación y facilitando su mantenimiento.

Implementación en Angular

Para implementarlo en angular, seguiremos los siguientes pasos:

Lo primero crear nuestro proyecto, te dejo un tutorial donde lo explicamos.

Crear y ejecutar un proyecto angular

Creamos una componente de prueba:

Recuerda de añadir el componente en app.module:

Instalamos el cliente de ngxs con el siguiente comando:

Esto nos permitirá generar la base de las acciones y el estado. Lo hacemos global con -g para usarlo en cualquier proyecto.

Ahora, crearemos los ficheros de acciones y state para nuestro componente:

Te creará una carpeta llamada state con el siguiente contenido:

Creamos una clase Person dentro del componente:

Instalamos @ngxs/store con el siguiente comando:

Vamos a app.module e importamos el modulo NgxsModule. Usamos el método forRoot y le pasamos un array con las clases de estado que queramos importar, en nuestro caso PeopleState.

Vamos al fichero people.actions y adaptamos la acción por defecto por la siguiente:

Es importante saber que la propiedad type de cada acción debe ser diferentes entre sí, ya que si puede lanzar más de una acción a la vez, normalmente se le suele poner como un prefijo ([People]).

En el constructor, añadimos un payload con un objeto donde le insertaremos los parámetros que queramos pasar, sino necesitas parámetros, no es necesario ponerlo.

Ahora, vamos al fichero people.state vamos a adaptarlo a la acción que queremos y la clase Person.

Explicamos algunos detalles:

  • PeopleStateModel: Propiedades del estado de People, añadiremos todo lo que necesitemos. En nuestro caso, las personas que vamos a almacenar.
  • defaults: Valores por defecto de las propiedades del estado.
  • @Action(): indica la acción que se ejecutará pasándole el objeto StateContext con los métodos a utilizar y el payload si lo tiene.

Todo State tiene que tener un nombre asociado, en nuestro caso people.

Ahora vamos a crear un servicio donde vamos a almacenar los datos que queremos recoger o filtrar. También puede ser útil para una futura integración con un backend.

Copia el siguiente código y pegalo en el fichero que se ha creado.

Volvemos al fichero people.state, inyectamos el nuevo servicio y llamamos a la función fetchPeople.

Con setState actualizamos las propiedades del estado.

Con esto tenemos lo básico para recoger las acciones y ejecutarlas pero aun no tenemos la conexión con el componente. Para ello, en el fichero people.state, añadiremos un @Selector.

Este @Selector nos permite obtener una de las propiedades del estado.

Volvemos al componente, a su ts.

Necesitaremos los siguiente:

  • Un array donde almacenar las personas que obtengamos.
  • Asociar la propiedad people con un @Select mediante un observable.
  • Desencadenar la acción

En la parte HTML, mostraremos el filtro y una tabla con los datos de la persona.

Puedes mejorarlo con bootstrap: https://discoduroderoer.es/instalar-bootstrap-4-en-nuestra-aplicacion-angular/ Como estamos usando ngModel, debemos importar FormsModule en nuestro app.module.

No olvidemos las rutas (app.routing.ts):

Ni del fichero app.component.html:

Ejecutamos nuestro proyecto:

Este es el resultado:

Fíjate que cada vez que filtramos, se ejecutan los siguientes pasos empezando desde el componente:

  • Nos subscribimos a la propiedad del estado que queremos mostrar.
  • Lanzamos la acción.
  • La store llama a la acción correspondiente usando el servicio que hemos creado.
  • El servicio nos filtra las personas.
  • La store modifica el estado.
  • La subscripción del primer paso, salta y actualizamos los datos.

Aquí te dejo un video donde explico un ejemplo de NGXS.

https://youtu.be/OQLjEu8X0X0

También el repositorio con el ejemplo que hemos visto.

https://github.com/DiscoDurodeRoer/example-web-ngxs-angular

Espero que os sea de ayuda. Si tenéis dudas, preguntad. Estamos para ayudarte.

Compartir

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


Warning: Trying to access array offset on value of type null in /home2/discodur/public_html/discoduroderoer/wp-content/themes/disto/single.php on line 539