Moment.js con Vuejs


128

Provo a stampare la data e l'ora usando come segue in vue-for

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

ma non appare. È solo uno spazio vuoto. Come posso provare a usare il momento in vue?

Risposte:


229

Con il tuo codice, vue.jssta tentando di accedere al moment()metodo dal suo ambito.

Quindi dovresti usare un metodo come questo:

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

Se vuoi passare una data alla moment.js, ti consiglio di utilizzare i filtri:

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

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

[Demo]


7
se usi es6, non dimenticare - importa il momento da 'momento';
patie

2
I filtri sono disabilitati in Vue 2+. Dovresti invece usare una proprietà calcolata. Vedi la mia risposta a questa domanda.
Paweł Gościcki

Per Vue v2 puoi utilizzare il filtro globale vuejs.org/v2/api/#Vue-filter
Jaroslav Klimčík

Risposta rapida e chiara che funziona in un componente. Rispetto.
joshfindit

@ PawełGościcki sei sicuro che i filtri non funzionino in Vue2? perché per me lo fanno
Dave Howson

145

Se il tuo progetto è un'applicazione a pagina singola, (es. Progetto creato da vue init webpack myproject), ho trovato questo modo più intuitivo e semplice:

In main.js

import moment from 'moment'

Vue.prototype.moment = moment

Quindi nel tuo modello, usa semplicemente

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

Dovrebbe funzionare anche per altri tipi di applicazioni oltre alle SPA.
iAmcR

Mi piace molto questo metodo di utilizzo di Moment. Grazie per la condivisione! L'ho appena implementato ma con una piccola modifica come suggerito nei documenti, Vue.prototype. $ Moment = moment. vuejs.org/v2/cookbook/adding-instance-properties.html .
Josh

Semplice ma non puoi avere il riconoscimento del tipo nel codice VS.
Alvin Konda

28

Nella tua package.jsonnel "dependencies"momento in cui la sezione add:

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

Nel componente in cui desideri utilizzare moment, importalo:

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

E nello stesso componente aggiungi una proprietà calcolata:

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

E poi nel modello di questo componente:

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

1
Vale la pena notare che se, invece di usare una funzione senza parametri, vuoi usare una funzione come: date2day: function (date) {return moment(date).format('dddd')} Non puoi usare computede dovresti usare methodsinvece.
andresgottlieb

13

L'ho fatto funzionare con Vue 2.0 in un unico componente file.

npm install moment nella cartella in cui hai installato vue

<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>

Perché metodo, perché non calcolato?
Serhii Matrunchyk

Per scopi di visualizzazione, ho usato il metodo. Sentiti libero di usare la proprietà calcolata.
max

4

Ecco un esempio che utilizza una libreria wrapper di terze parti per Vue chiamata vue-moment .

Oltre a collegare l'istanza Moment all'ambito radice di Vue, questa libreria include momente durationfiltra.

Questo esempio include la localizzazione e utilizza le importazioni di moduli ES6, uno standard ufficiale, invece di quanto richiesto dal sistema di moduli CommonJS di 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 });

Ora puoi utilizzare l'istanza Moment direttamente nei tuoi modelli Vue senza alcun markup aggiuntivo:

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

Oppure i filtri:

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

2
FYI: Questa risposta è stata contrassegnata come di bassa qualità a causa della sua lunghezza e del suo contenuto. Potresti voler migliorare spiegando come questo risponde alla domanda di 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

Buon uso dei plugin per isolare le cose relative ai momenti in un file separato. Funziona alla grande!
Pedro

0

Importerei semplicemente il modulo moment, quindi utilizzerei una funzione calcolata per gestire la mia logica moment () e restituirei un valore a cui si fa riferimento nel modello.

Anche se non l'ho usato e quindi non posso parlare della sua efficacia, ho trovato https://github.com/brockpetrie/vue-moment per una considerazione alternativa


0

vue-moment

plugin molto carino per il progetto vue e funziona molto bene con i componenti e il codice esistente. Goditi i momenti ... 😍

// 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")}}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.