#javascript #vue.js #vuejs2 #vue-component #vuex
#javascript #vue.js #vuejs2 #vue-компонент #vuex
Вопрос:
Я хочу создать универсальную функцию для использования внутри мутаций и методов. Эта функция получает параметр, а затем возвращает логическое значение, например:
estadoFunction(date){
var dateObj = new Date();
var month = dateObj.getUTCMonth() 1; //months from 1-12
var day = dateObj.getUTCDate();
var year = dateObj.getUTCFullYear();
var fechaActual = new Date(year "-" month "-" day);
var fechaInicioEvento = new Date(date);
if(fechaInicioEvento > fechaActual){
return true;
}else{
return false;
}
}
Я хотел бы использовать estadoFunction(date) внутри методов и мутаций, например:
methods: {
estado(date){
if(this.estadoFunction(date)){
return "Abierto";
}else{
return "Cerrado";
}
}
}
Я попытался создать мутацию, а затем использовать ее внутри другой мутации с фиксацией, но estadoFunction(date) возвращает undefined, с другой стороны, console.log(«true») и console.log(«false») работают.
mutations: {
llamarJsonMutation(state, llamarJsonAction){
state.programas = llamarJsonAction.BD_programas;
//filtro por eventos cerrados y abiertos
llamarJsonAction.Nueva_estructura_proveedor.forEach( item => {
if(this.commit("estadoFunction", item.fechaFin)){
state.actividadesPrimerFiltro.push(item);
}
});
state.actividades = state.actividadesPrimerFiltro.sort((a, b) => parseFloat(a.fechaInicio) - parseFloat(b.fechaInicio));
},
estadoFunction(date){
var dateObj = new Date();
var month = dateObj.getUTCMonth() 1; //months from 1-12
var day = dateObj.getUTCDate();
var year = dateObj.getUTCFullYear();
var fechaActual = new Date(year "-" month "-" day);
var fechaInicioEvento = new Date(date);
if(fechaInicioEvento > fechaActual){
console.log("true");
return true;
}else{
console.log("false");
return false;
}
}
}
Не могли бы вы мне помочь?, это мой полный код javascript:
//componentes
Vue.component('actividades', {
template: /*html*/
`
<div class="col-lg-8">
<template v-for="(item, key) in actividades">
<ul>
<li>{{ estado(item.fechaFin) }}</li>
<ul>
</template>
</div>
`,
computed: {
...Vuex.mapState(['actividades','programas']),
},
methods: {
estado(date){
if(this.estadoFunction(date)){
return "Abierto";
}else{
return "Cerrado";
}
}
}
});
//VueEx
const store = new Vuex.Store({
state: {
actividadesPrimerFiltro: [],
actividades: [],
programas: []
},
mutations: {
llamarJsonMutation(state, llamarJsonAction){
state.programas = llamarJsonAction.BD_programas;
//filtro por eventos cerrados y abiertos
llamarJsonAction.Nueva_estructura_proveedor.forEach( item => {
if(this.commit("estadoFunction", item.fechaFin)){
state.actividadesPrimerFiltro.push(item);
}
});
state.actividades = state.actividadesPrimerFiltro.sort((a, b) => parseFloat(a.fechaInicio) - parseFloat(b.fechaInicio));
},
estadoFunction(date){
var dateObj = new Date();
var month = dateObj.getUTCMonth() 1; //months from 1-12
var day = dateObj.getUTCDate();
var year = dateObj.getUTCFullYear();
var fechaActual = new Date(year "-" month "-" day);
var fechaInicioEvento = new Date(date);
if(fechaInicioEvento > fechaActual){
return true;
}else{
return false;
}
}
},
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');
}
});
Ответ №1:
Мутации не должны вызывать другие мутации (действия могут вызывать несколько мутаций), и вас не должны интересовать возвращаемые значения из мутаций / действий.
Если вы используете пакет, подобный Vue CLI, было бы лучше создать для него отдельный модуль (например Utilities.js ) и импортируйте его в магазин и любой компонент.
Поскольку вы используете CDN, вы можете определить estadoFunction
выше своего кода Vue. Например:
estadoFunction(date){
...
}
/***** App begins here *****/
//componentes
Vue.component('actividades', {
...
}
И использовать ее где угодно напрямую. Например, в вашем estado
методе:
methods: {
estado(date){
if(estadoFunction(date)){
return "Abierto";
}else{
return "Cerrado";
}
}
}