¿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.
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
Ese es mi código de javascript:
//componentes
Vue.component('actividades', {
template: /*html*/
`
icono
Marzo 08 Abril 17 2020
Tipo de programa {{ item.tipoPrograma }}
Facultad {{ item.facultad }}
Programa {{ item.programa }}
Categoria {{ item.categoria }}
{{ item.contenido }}
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
Lugar: Universidad del Rosario, Sede, Claustro, Aula Mutis
Fecha de inicio:
Marzo, de {{ year(item.fechaInicio) }}
Fecha de cierre: 12 Marzo, de 2020
Hora: De 8:00 a.m. a 12:30 p.m
`,
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
iconoMarzo 08 Abril 17 2020Tipo de programa {{ item.tipoPrograma }}
Facultad {{ item.facultad }}
Programa {{ item.programa }}
Categoria {{ item.categoria }}{{ item.contenido }}
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using &
Lugar: Universidad del Rosario, Sede, Claustro, Aula Mutis39;Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
Fecha de inicio: Marzo, de {{ getYear(item.fechaInicio) }}
Fecha de cierre: 12 Marzo, de 2020
Hora: De 8:00 a.m. a 12:30 p.mMuestra:
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 llamadagetYear
. Llamamos a esta acción desde la plantilla usando la sintaxisgetYear(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