Acciones asincrónicas en Vuex: cómo implementarlas y utilizarlas

Clase 43 de 53Curso Profesional de Vue.js 2

Resumen

¿Qué son las actions en Vuex?

Las actions en Vuex son una solución para manejar operaciones asincrónicas dentro de nuestra aplicación. En Vuex, las mutations deben ser sincrónicas, lo cual limita la capacidad de realizar llamadas asincrónicas como solicitudes HTTP dentro de ellas. Las actions permiten escribir código asincrónico y ejecutar una mutación una vez que ese código ha completado su ejecución.

¿Cómo funcionan las actions?

Las actions son similares a las mutations en cuanto a que terminan utilizando mutaciones. Sin embargo, su principal función es manejar tareas asincrónicas. Al definir una action, se puede simular una llamada asincrónica mediante setTimeout en JavaScript. Este método permite esperar un cierto tiempo antes de ejecutar una función, emulando así el comportamiento asincrónico.

Ejemplo de código de una action

Aquí un ejemplo de cómo se define una action en JavaScript:

actions: {
  incrementAsync({ commit }, payload) {
    setTimeout(() => {
      commit('increment', payload);
    }, 2000); // Simula una demora asincrónica de 2 segundos
  }
}

En este caso, la acción incrementAsync espera 2 segundos antes de ejecutar la mutación increment.

¿Qué rol juega el context y el payload en las actions?

  • Context: Este objeto representa la instancia del store dentro de una acción. Desde el context, se puede acceder a los métodos commit para ejecutar mutaciones y a getters para obtener datos del estado.
  • Payload: Al igual que en las mutaciones, es un objeto que contiene información que podemos enviar a la action.

¿Cómo integrar las actions con los componentes?

Para ejecutar una action desde un componente, utilizamos el método dispatch del store. A continuación, se muestra cómo se haría esto en un método de un componente:

methods: {
  incrementAsync() {
    this.$store.dispatch('incrementAsync', { number: 2 });
  }
}

Se llama a la acción incrementAsync y se le pasa un objeto payload con el número 2.

¿Cómo manejar el resultado de una action?

Cuando una acción ha terminado su operación asincrónica, a menudo necesitamos realizar alguna tarea adicional. Esto se puede lograr retornando una promesa desde la acción, permitiendo usar .then() en el componente para manejar el resultado.

Ejemplo de uso de promesas con acciones

actions: {
  incrementAsync({ commit }, payload) {
    return new Promise((resolve) => {
      setTimeout(() => {
        commit('increment', payload);
        resolve();
      }, 2000);
    });
  }
}

En el componente, podemos manejar la finalización de la acción así:

methods: {
  incrementAsync() {
    this.$store.dispatch('incrementAsync', { number: 2 })
      .then(() => {
        console.log('Acción terminada');
      });
  }
}

Este método asegura que una vez que la acción haya completado sus tareas, se invoque el callback del .then(), donde se puede implementar cualquier lógica adicional necesaria. Esto es especialmente útil en aplicaciones donde la sincronización con procesos asincrónicos es crucial para una UX fluida.

Practique y mejore

Ahora que comprende cómo funcionan las actions en Vuex, no dude en practicar integrando estas enseñanzas en proyectos reales. Familiarizarse con estos patrones es esencial para dominar el desarrollo con Vue.js y crear aplicaciones fluidas y eficientes. ¡Siga aprendiendo!