# Vuex

Una solución para compartir/intercambiar/modificar/añadir... datos, métodos y acciones entre archivos es Vuex.

Vuex

Vuex permite centralizar los datos, métodos y acciones.

Store

Funciona igual que la parte del script que habíamos visto hasta ahora con pequeñas diferencias. data === store, methods === actions y computed === getters

AppVsStore

Para este intercambios de datos tenemos que establecer un protocolo para su reactividad.

Store

Una vez actualizados los datos tienen que recibirse en los archivos vinculados.

Store

Esto lo conseguimos con las mutaciones que se encargan de actualizar los datos una vez que son enviados a través de las acciones.

Store

# Como comunicarse con Vuex

this.$store.state.nombreObjeto
this.$store.dispatch.('nombreFuncion', 'payload')

# Acciones y Mutaciones VUEX

async obtenerDatos () { 
  const data = await getDocs(collection(db, "productos"));
    data.forEach((doc) => {
    let producto = doc.data()
    producto.id = doc.id
    this.productos.push(producto)
    console.log(producto)
  });
},

vs

state: {
  usuario: null,
  obras: [],
  obra: {
    id: "",
    title: "",
    author: "",
    date: "",
    synopsis: "",
    link: "",
    photo: "",
    categoria: "",
    editorial: "",
    pelicula: "",
    comic: "",
  },
},

mutations:

SET_OBRAS(state, payload) {
  state.obras = payload;
},

actions:

async obtenerDatos({ commit }) {
  const obras = [];
  const data = await getDocs(collection(db, "obras"));
  data.forEach((doc) => {
    let obra = doc.data();
    obra.id = doc.id;
    obras.push(obra);
    console.log(obra);
  });
  commit("SET_OBRAS", obras);
},

# Methods y computed VIEWS

import { mapActions, mapState } from 'vuex'

methods

methods: {
  ...mapActions(['obtenerDatos'])
},
computed: {
...mapState(['obras', 'obra'])
},
created(){
    this.obtenerDatos()
},

# Alternativa

methods: {
  enviar (){
    this.$store.dispatch('obtenerDatos')
  },
  recibir(){
    this.$store.state.obras
  }
},
created(){
  this.enviar()
  this.recibir()
},