Moment.js avec Vuejs

128

J'essaye d'imprimer l'heure de la date en utilisant comme suit dans vue-for

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

mais, cela n'apparaît pas. C'est juste un blanc. Comment puis-je essayer d'utiliser le moment en vue?

Définir Kyar Wa Lar
la source

Réponses:

229

Avec votre code, le vue.jstente d'accéder à la moment()méthode depuis sa portée.

Par conséquent, vous devez utiliser une méthode comme celle-ci:

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

Si vous souhaitez passer une date au moment.js, je vous suggère d'utiliser des filtres:

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

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

[démo]

Pantelis Peslis
la source
7
si vous utilisez es6, n'oubliez pas - importez le moment de «moment»;
patie
2
Les filtres sont désactivés dans Vue 2+. Vous devez utiliser une propriété calculée à la place. Voir ma réponse à cette question.
Paweł Gościcki
Pour Vue v2, vous pouvez utiliser le filtre global vuejs.org/v2/api/#Vue-filter
Jaroslav Klimčík
Réponse claire et rapide qui fonctionne dans un composant. Le respect.
joshfindit
@ PawełGościcki Etes-vous sûr que les filtres ne fonctionnent pas dans Vue2? parce que pour moi ils le font
Dave Howson
145

Si votre projet est une application sur une seule page (par exemple, un projet créé par vue init webpack myproject), j'ai trouvé que cette méthode est la plus intuitive et la plus simple:

Dans main.js

import moment from 'moment'

Vue.prototype.moment = moment

Ensuite, dans votre modèle, utilisez simplement

<span>{{moment(date).format('YYYY-MM-DD')}}</span>
Geng Jiawen
la source
Devrait également fonctionner pour d'autres types d'applications en dehors des SPA.
iAmcR le
J'aime vraiment cette méthode d'utilisation de Moment. Merci d'avoir partagé! Je viens de l'implémenter mais avec un petit changement comme suggéré dans la documentation, Vue.prototype. $ Moment = moment. vuejs.org/v2/cookbook/adding-instance-properties.html .
Josh le
Simple mais vous ne pouvez pas avoir de reconnaissance de type dans le code VS.
Alvin Konda le
28

Dans votre package.jsondans la "dependencies"section ajouter un moment:

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

Dans le composant où vous souhaitez utiliser moment, importez-le:

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

Et dans le même composant, ajoutez une propriété calculée:

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

Et puis dans le modèle de ce composant:

<p>{{ timestamp }}</p>
Paweł Gościcki
la source
1
Il convient de noter que si, au lieu d'utiliser une fonction sans paramètre, vous souhaitez utiliser une fonction telle que: date2day: function (date) {return moment(date).format('dddd')} Vous ne pouvez pas utiliser computedet devez utiliser à la methodsplace.
andresgottlieb
13

Je l'ai fait fonctionner avec Vue 2.0 en composant de fichier unique.

npm install moment dans le dossier où vous avez installé 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>
max
la source
Pourquoi méthode, pourquoi pas calculée?
Serhii Matrunchyk
À des fins d'affichage, j'ai utilisé la méthode. N'hésitez pas à utiliser la propriété calculée.
max
4

Voici un exemple utilisant une bibliothèque de wrapper tierce pour Vue appelée vue-moment.

En plus de lier l'instance Moment dans la portée racine de Vue, cette bibliothèque inclut momentet durationfiltre.

Cet exemple inclut la localisation et utilise les importations de modules ES6, une norme officielle, au lieu des exigences du système de modules 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 });

Vous pouvez maintenant utiliser l'instance Moment directement dans vos modèles Vue sans aucun balisage supplémentaire:

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

Ou les filtres:

<span>{{ 3600000 | duration('humanize') }}</span>
<!-- "an hour" -->
<span>{{ [2, 'years'] | duration('add', 1, 'year') | duration('humanize') }}</span>
<!-- "3 years" -->
Atchutha rama reddy Karri
la source
2
FYI: Cette réponse a été signalée comme étant de mauvaise qualité en raison de sa longueur et de son contenu. Vous voudrez peut-être l'améliorer en expliquant comment cela répond à la question d'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
la source
Bonne utilisation des plugins pour isoler les éléments liés au moment dans un fichier séparé. Fonctionne très bien!
Pedro
0

J'importerais simplement le module moment, puis utiliserais une fonction calculée pour gérer ma logique moment () et retournerais une valeur référencée dans le modèle.

Bien que je ne l'ai pas utilisé et que je ne puisse donc pas parler de son efficacité, j'ai trouvé https://github.com/brockpetrie/vue-moment pour une autre considération

CodeFromthe510
la source
0

vue-moment

très beau plugin pour le projet vue et fonctionne très bien avec les composants et le code existant. Profitez des moments ... 😍

// 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
la source