¿Cómo utilizar una mutación dentro de una plantilla de componente? VUEX

Estoy aprendiendo Vue con VUEX y estoy haciendo y aplicación pequeña. Esa pequeña aplicación llama a los datos json e imprímalo en una plantilla. He creado una mutación llamada año(), que la mutación consigue un mundo de una cuerda y devuelve el resultado, pero cuando uso esa mutación dentro de la plantilla {{ año(item.fechaInicio)}} devolver un valor vacío.

show page

Ese es mi código HTML:

html


    Vue


     bootstrap 4 CSS 


 fontawesome css 


 Tipografía 


 Jquery 



 cookies jquery 



     Vue 
    
     Vuex 
    
     CSS estilos 
    




    

Calendario Académico

TAB 1 ESTUDIANTES
Semestres

Enero 17-2020
Mayo 15-2020

Agosto 15-2020
Diciembre 20-2020

Enero 17-2020
Mayo 15-2020

 
Formulario de Busqueda
 

Fecha inicial

Fecha final

Buscar
Limpiar

Ese es mi código de javascript:

//componentes
Vue.component('actividades', {
    template: /*html*/
        ` 
        
`, computed: { ...Vuex.mapState(['actividades','programas']), }, methods: { ...Vuex.mapActions(['llamarJson']), ...Vuex.mapMutations(['year']) } }); //VueEx const store = new Vuex.Store({ state: { actividades: [], programas: [] }, mutations: { llamarJsonMutation(state, llamarJsonAction){ state.actividades = llamarJsonAction.Nueva_estructura_proveedor; state.programas = llamarJsonAction.BD_programas; }, year(date){ return String(date).substr(8, 2); } }, actions: { llamarJson: async function({ commit }){ const data = await fetch('calendario-2021-prueba.json'); const dataJson = await data.json(); commit('llamarJsonMutation', dataJson); } } }); //Vue new Vue({ el: '#caja-vue', store: store, created() { this.$store.dispatch('llamarJson'); } });

Pregunta hecha hace 3 años, 4 meses, 27 días - Por bytebard


3 Respuestas:

  • No devuelva el valor en mutación. Las mutaciones son para los estados mutantes en vuex. En su lugar, añadir una propiedad a estado como año entonces en el mutaitioner sólo añadir :

    state.year = String(date).substr(8, 2);
    

    Luego en su componente y en adición computada:

    year(){
        return this.store.state.year;
    }
    

    Y ahora, puedes acceder {{year}} en tu plantilla.

    Respondida el Dec 18, 2020 a las 22:25 - por pixelpioneerbbb5

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando es que estás intentando utilizar una mutación en lugar de un getter para realizar una transformación en los datos antes de mostrarlos en la plantilla. Las mutaciones en Vuex se utilizan para modificar el estado de la aplicación de manera síncrona, no para realizar transformaciones en los datos.

    En su lugar, puedes utilizar un getter para realizar la transformación que necesitas antes de mostrarlo en la plantilla. Te recomendaría modificar tu código de la siguiente manera:

    • Elimina la mutación `year` del objeto `mutations` en Vuex y crea un getter en su lugar.
    javascript
    getters: {
      getYear: state => date => {
        return String(date).substr(8, 2);
      }
    }
    
    • Modifica la sección de `methods` en tu componente `actividades` para que puedas utilizar el getter `getYear`:
    javascript
    methods: {
      ...Vuex.mapActions(['llamarJson']),
      ...Vuex.mapGetters(['getYear'])
    }
    
    • Modifica la plantilla del componente `actividades` para utilizar el getter en lugar de la mutación:
    html
    Fecha de inicio:
    Marzo, de {{ getYear(item.fechaInicio) }}

    Con estos cambios, deberías poder obtener el resultado deseado al llamar al getter getYear en la plantilla de tu componente. ¡Espero que esto te ayude a solucionar tu problema!

    Respondida el Dec 19, 2020 a las 22:22 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema es que estás intentando llamar a una mutación dentro de una plantilla, lo cual no está permitido. Las mutaciones solo se pueden llamar desde dentro de las acciones o los componentes.

    Para solucionar este problema, debes mover la lógica de la mutación year a una acción y luego llamar a esa acción desde el componente.

    Aquí tienes el código actualizado:

    Componente actividades:

    html
    

    Muestra:

    javascript
    const store = new Vuex.Store({
        state: {
            actividades: [],
            programas: []
        },
        mutations: {
            llamarJsonMutation(state, llamarJsonAction){
                state.actividades = llamarJsonAction.Nueva_estructura_proveedor;
                state.programas = llamarJsonAction.BD_programas;
            }
        },
        actions: {
            llamarJson: async function({ commit }){
                const data = await fetch('calendario-2021-prueba.json');
                const dataJson = await data.json();
                commit('llamarJsonMutation', dataJson);
            },
            getYear: function({ commit }, date){
                return String(date).substr(8, 2);
            }
        }
    });
    
    new Vue({
        el: 'caja-vue',    store: store,
        created() {
            this.$store.dispatch('llamarJson');
          }
    });
    

    Explicación:

    En el código actualizado, hemos movido la lógica de la mutación year a una acción llamada getYear. Llamamos a esta acción desde la plantilla usando la sintaxis getYear(item.fechaInicio). Esto garantiza que la lógica de la mutación solo se ejecute cuando sea necesario y no interfiera con el ciclo de vida de Vue.

    Respondida el Dec 19, 2020 a las 22:27 - por Gemini

    Votos positivos: 0 | Votos negativos: 0