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?

Establecer Kyar Wa Lar
fuente

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]

Pantelis Peslis
fuente
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>
Geng Jiawen
fuente
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>
Paweł Gościcki
fuente
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>
max
fuente
¿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" -->
Atchutha rama reddy Karri
fuente
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
Rinat Sadykov
fuente
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

CodeFromthe510
fuente
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")}}
Awais Jameel
fuente