Moment.js con Vuejs


128

Intento imprimir la fecha y la hora usando lo siguiente en vue-for

{{ moment().format('MMMM Do YYYY, h:mm:ss a') }}

pero no aparece. Es solo un espacio en blanco. ¿Cómo puedo intentar usar moment in vue?

Respuestas:


229

Con su código, vue.jsestá intentando acceder al moment()método desde su alcance.

Por lo tanto, debe usar un método como este:

methods: {
  moment: function () {
    return moment();
  }
},

Si desea pasar una fecha al moment.js, sugiero usar filtros:

filters: {
  moment: function (date) {
    return moment(date).format('MMMM Do YYYY, h:mm:ss a');
  }
}

<span>{{ date | moment }}</span>

[manifestación]


77
si usa es6, no lo olvide: importe el momento desde el 'momento';
Patie

2
Los filtros están deshabilitados en Vue 2+. En su lugar, debe usar una propiedad calculada. Vea mi respuesta a esta pregunta.
Paweł Gościcki

Para Vue v2 puede usar el filtro global vuejs.org/v2/api/#Vue-filter
Jaroslav Klimčík

Respuesta rápida y clara que funciona en un componente. El respeto.
joshfindit

@ PawełGościcki, ¿estás seguro de que los filtros no funcionan en Vue2? porque para mí lo hacen
Dave Howson

145

Si su proyecto es una aplicación de una sola página (por ejemplo, un proyecto creado por vue init webpack myproject), descubrí que esta forma es más intuitiva y simple:

En main.js

import moment from 'moment'

Vue.prototype.moment = moment

Luego, en su plantilla, simplemente use

<span>{{moment(date).format('YYYY-MM-DD')}}</span>

También debería funcionar para otros tipos de aplicaciones además de las SPA.
iAmcR

Realmente me gusta este método de usar Moment. ¡Gracias por compartir! Lo acabo de implementar pero con un pequeño cambio como se sugiere en los documentos, Vue.prototype. $ Moment = moment. vuejs.org/v2/cookbook/adding-instance-properties.html .
Josh

Simple pero no puede tener reconocimiento de tipo en el código VS.
Alvin Konda

28

En su package.jsonen la "dependencies"sección agregar momento:

"dependencies": {
  "moment": "^2.15.2",
  ...
}

En el componente donde le gustaría usar moment, impórtelo:

<script>
import moment from 'moment'
...

Y en el mismo componente agregue una propiedad calculada:

computed: {
  timestamp: function () {
    return moment(this.<model>.attributes['created-at']).format('YYYY-MM-DD [at] hh:mm')
  }
}

Y luego en la plantilla de este componente:

<p>{{ timestamp }}</p>

1
Vale la pena señalar que si, en lugar de usar una función sin parámetros, desea usar una función como: date2day: function (date) {return moment(date).format('dddd')} No puede usar computed, y debería usar methodsen su lugar.
andresgottlieb

12

Lo hice funcionar con Vue 2.0 en un solo componente de archivo.

npm install moment en la carpeta donde tienes vue instalado

<template>
  <div v-for="meta in order.meta">
    {{ getHumanDate(meta.value.date) }}
  </div>
</template>
<script>
    import moment from 'moment';
    export default {
         methods: {
            getHumanDate : function (date) {
                return moment(date, 'YYYY-MM-DD').format('DD/MM/YYYY');
            }
        }
    }
</script>

¿Por qué método, por qué no se calcula?
Serhii Matrunchyk

Para fines de visualización, utilicé el método. Siéntase libre de usar la propiedad calculada.
max

4

Aquí hay un ejemplo usando una biblioteca de envoltorio de terceros para Vue llamada vue-moment.

Además de vincular la instancia de Moment en el ámbito raíz de Vue, esta biblioteca incluye momenty durationfiltros.

Este ejemplo incluye la localización y está utilizando las importaciones del módulo ES6, un estándar oficial, en lugar de lo que requiere el sistema de módulos CommonJS de NodeJS.

import Vue from 'vue';

import moment from 'moment';
import VueMoment from 'vue-moment';

// Load Locales ('en' comes loaded by default)
require('moment/locale/es');

// Choose Locale
moment.locale('es');

Vue.use(VueMoment, { moment });

Ahora puede usar la instancia de Moment directamente en sus plantillas de Vue sin ningún marcado adicional:

<small>Copyright {{ $moment().year() }}</small>

O los filtros:

<span>{{ 3600000 | duration('humanize') }}</span>
<!-- "an hour" -->
<span>{{ [2, 'years'] | duration('add', 1, 'year') | duration('humanize') }}</span>
<!-- "3 years" -->

2
FYI: Esta respuesta se marcó como de baja calidad debido a su longitud y contenido. Es posible que desee mejorarlo explicando cómo esto responde la pregunta de OP.
Oguz Ismail

3
// plugins/moment.js

import moment from 'moment';

moment.locale('ru');

export default function install (Vue) {
  Object.defineProperties(Vue.prototype, {
    $moment: {
      get () {
        return moment;
      }
    }
  })
}

// main.js

import moment from './plugins/moment.js';
Vue.use(moment);

// use this.$moment in your components

Buen uso de complementos para aislar cosas relacionadas con el momento en un archivo separado. ¡Funciona genial!
Pedro

0

Simplemente importaría el módulo de momento, luego usaría una función calculada para manejar mi lógica de momento () y devolvería un valor al que se hace referencia en la plantilla.

Si bien no he usado esto y, por lo tanto, no puedo hablar sobre su efectividad, encontré https://github.com/brockpetrie/vue-moment para una consideración alternativa


0

vue momento

Muy buen complemento para vue project y funciona muy bien con los componentes y el código existente. Disfruta los momentos ... 😍

// in your main.js
Vue.use(require('vue-moment'));
// and use in component
{{'2019-10-03 14:02:22' | moment("calendar")}}
// or like this
{{created_at | moment("calendar")}}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.