Saltar al contenido

La mayoría de las veces el trabajo con fechas nos hace perder bastante tiempo, no es un trabajo sencillo, por ese motivo en este tutorial te voy a explicar cómo trabajar con fechas en Vuejs 2 y Vuex utilizando Moment.

Lo primero que debes instalar y configurar en tu proyecto es Vuex y Moment. yarn add vuex moment Una vez instalado y configurado, vamos a crear un módulo para manejar fechas con Vuex.

const moment = require('moment');

const state = {
    start_date: moment(new Date()).local().format('YYYY-MM-DDTHH:mm'),
    end_date: moment().add(30, 'days').local().format('YYYY-MM-DDTHH:mm'),
};

const mutations = {
    SET_START_DATE: (state, value) => {
        state.start_date = value;
    },
    SET_END_DATE: (state, value) => {
        state.end_date = value;
    },
};

const getters = {
    differenceDate (state) {
        const start = moment(state.start_date);
        const end = moment(state.end_date);
        return end.diff(start, 'days');
    }
};

export default {
    state,
    mutations,
    getters
}

Simple, definimos start_date y end_date dentro del estado, un par de mutaciones para modificar estos datos y finalmente un getter para obtener la diferencia entre ambas fechas.

Para que nuestro módulo funcione recuerda crear la store y añadirla a tu app.

import Vuex from 'vuex';
Vue.use(Vuex);
import DateModule from './modules/date.module';
const store = new Vuex.Store({
    modules: {
        DateModule
    }
});

new Vue({
  router,
  store, //aquí
  render: h => h(App)
}).$mount('#app')

Para utilizar todo lo que hemos hecho dentro de un componente es muy simple, haciendo uso de computed, mapGetters y setters y getters podemos tenerlo todo controlado con poco código.

<template>
    <div id="date-component">
        <form>
            <label>Start</label>
            <input
                type="datetime-local"
                name="start_date"
                v-model="start_date"
            />
            <label>End</label>
            <input
                type="datetime-local"
                name="end_date"
                v-model="end_date"
            />

            <p>Diferencia en días: {{ differenceDate }}</p>
        </form>
    </div>
</template>

<script>
    import {mapGetters} from 'vuex';
    export default {
        name: 'date-component',
        computed: {
            ...mapGetters(['differenceDate']),
            start_date: {
                get () {
                    return this.$store.state.DateModule.start_date;
                },
                set (value) {
                    this.$store.commit('SET_START_DATE', value);
                }
            },
            end_date: {
                get () {
                    return this.$store.state.DateModule.end_date;
                },
                set (value) {
                    this.$store.commit('SET_END_DATE', value);
                }
            }
        }
    }
</script>

<style scoped>
    #date-component * {
        font-size: 25px;
    }
</style>

Rutas de aprendizaje