Saltar al contenido

Etiqueta: vuejs

Cargar dinámicamente mixins distintos desde Vue router

Si estas haciendo aplicaciones con Vue.js es probablemente que estés usando los mixins para reutilizar el código. En algunos casos, existe la posibilidad de que tengas dos o más mixins con los mismos nombres de métodos pero implementando las funcionalidades de forma distinta. Pero solo necesites importar/inyectar uno solo en la vista actual. Entonces es necesario cargar dinámicamente mixins distintos desde el router dependiendo de la ruta.

Cómo cargar dinámicamente mixins distintos

En mi caso dependiendo de la ruta, necesitaba cargar código específico. Esto es para poder reciclar la vista, el cual llama a métodos con los mismos nombres en los distintos mixin. Como Vue.js 2 no soporta importar objectos de form dinámica, no podemos hacer los imports mediante una condición inicial. Así que la forma que encontré es pasando un nuevo componente que sea hijo (para heredar los atributos y métodos) de tu mixin. Defines en cada ruta, este nuevo componente y defines que herede el mixin correspondiente.

La solución a cargar dinámicamente mixins distintos es que Vue router permite en la sección de component pasar el componente que reutilizas (en mi caso el de la vista) y luego pasar en el atributo mixins, un arreglo con el mixin que debe usar esa vista.

A continuación puedes ver a qué me refiero:

{
      path: "/rutaA",
      name: "ComponenteA",
      component: {
        extends: ComponenteComun,
        mixins: [mixinA]
      }
    },
    {
      path: "/rutaB",
      name: "ComponenteB",
      component: {
        extends: ComponenteComun,
        mixins: [mixinB]
      }
    },

Con esto, cuando se entra a una ruta el router creará un nuevo componente con los métodos, atributos y observadores del componente a reusar. Pero como se está definiendo un mixin distinto a cada vista tendrán implementaciones distintas.

Espero que está guía te haya servido en tu proyecto informático. Si te gustó puedes compartirla o si deseas aportar algo a esta entrada, simplemente deja un comentario.

¡Gracias por leerla!

Deja un comentario

Crear notificaciones en Vue.js con Vuetify 2.0 y Vuex

Si están utilizando Vuetify y desean un componente para mostrar notificaciones en vue.js. Verán que existe una llamado Snackbar que permite implementarlos. El problema de este componente es que requiere definirse en cada vista que hagamos en Vue (por la naturaleza de esta librería) y debemos crear un método para mostrarlo.

Esto es un problema en aplicaciones grandes, porque tendríamos código repetido y descentralizado. Gracias a Vuex podemos evitar este tipo de cosas. Por lo que te explicaré como crear notificaciones con vue.js con Vuex.

Definir opciones del Snackbar en Vuex

Primero vamos a definir en vuestro archivo store.js (o donde instancias Vuex.Store) un estado para tener la configuración por defecto del Snackbar. El estado permite almacenar los parámetros del Snackbar de forma global y poder ser accedida desde cualquier vista. Para ello en la sección de state agrega las siguientes opciones:

export default new Vuex.Store({
  state: {
    snackbar: {
      visible: false,
      color: "success",
      text: null,
      timeout: 10000,
      multiline: false
    },
    ...
    ...
  },

Luego en el mismo archivo, definimos una mutación. En Vuex las mutaciones son los métodos que nos permiten modificar un estado. Esta mutación la usaremos a lo largo de la aplicación para lanzar la notificación desde cualquier lado.

El primer parámetro siempre es el estado actual y el segundo el payload. Éste último es enviado cada vez que llamamos a la notificación con el fin de definir la apariencia. Por ejemplo, si ocurre un error podemos enviar los parámetros de que el tipo de notificación sea error y aparezca de color rojo.

En este ejemplo, agregué opciones para decidir si mostrarlo en multi-línea , elegir color, tiempo de duración, etc. Así que en la sección de mutaciones del store.js agrega:


mutations: {
    alert(state, payload) {
      state.snackbar.text = payload.text;
      state.snackbar.multiline = payload.text.length > 50;

      // Si es mas de 50 caracteres definirlo como multilinea
      if (payload.multiline) {
        state.snackbar.multiline = payload.multiline;
      }
    
      // Color para mensajes de error o éxito
      if (payload.color) {
        state.snackbar.color = payload.color;
      }

     // Tiempo de duración
      if (payload.timeout) {
        state.snackbar.timeout = payload.timeout;
      }
      state.snackbar.visible = true;
   },
   closeAlert(state) {
      state.snackbar.visible = false;
      state.snackbar.multiline = false;
      state.snackbar.text = null;
    },
}

También en esta sección de mutaciones agregué una mutación llamada closeAlert(state) para poder alterar la configuración del snackbar y hacer que se oculte.

Crear el componente de la notificación

Lo mas fácil es crear un componente para la notificaciones. Pues así no mezclas código y lo puedes ubicar en un sólo lugar para que se lance.

Este componente consta simplemente de un Snackbar cuyas opciones son extraídas de un dato llamado snackbar. Este dato es extraído del estado de Vuex definido previamente a través de una variable computada.

Aquí puedes ver el ejemplo de mi componente:

<template>
  <v -snackbar="" top="" v-model="snackbar.visible" :timeout="snackbar.timeout" :multi-line="snackbar.multiline === true" :color="snackbar.color">
    {{ snackbar.text }}
    </v><v -btn="" text="" dark="" @click="closeAlert">Close</v>
  
</template>
<script>
import { mapMutations } from "vuex";
export default {
  computed: {
    snackbar() {
      return this.$store.state.snackbar;
    }
  },
  methods: {
    ...mapMutations(["closeAlert"])
  }
};
</script>

Ahora, para implementar el cierre, importo las mutaciones de Vuex para tener acceso a la función closeAlert que definimos previamente. De esta forma al llamar a closeAlert (una mutación) modificará el estado de la variable visible, haciendo que se oculte.

Este component lo puedes colocar antes del cierre de tu v-app para que se pued mostrar en todas las páginas.

Crear las notificaciones en Vue.Js

Cada vez que desees mostrar una notificaciones en vuej.js, solo debes realizar un commit. El primer parámetro es el nombre de la mutación, en este caso alert y las opciones del snackbar la pasas como segundo parámetro.

Un ejemplo para una notificación de error sería algo como:

this.$store.commit("alert", {
  color: "error",
  text:
    "Could not load purchase order info. Status Code: " +
    response.status
});

¡Listo! Ahora podrás mostrar notificaciones con vue.js de forma centralizada a lo largo de tu aplicación.

Deja un comentario