Moment.js z Vuejs


128

Próbuję wydrukować datę i godzinę za pomocą następującego polecenia w vue-for

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

ale się nie pojawia. To tylko puste miejsce. Jak mogę spróbować wykorzystać moment w vue?

Odpowiedzi:


229

Za pomocą Twojego kodu program vue.jspróbuje uzyskać dostęp domoment() metody z jej zakresu.

Dlatego powinieneś użyć takiej metody:

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

Jeśli chcesz przekazać termin do moment.js, proponuję zastosować filtry:

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

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

[próbny]


7
jeśli używasz es6, nie zapomnij - importuj moment z „chwili”;
patie

2
Filtry są wyłączone w Vue 2+. Zamiast tego należy użyć obliczonej właściwości. Zobacz moją odpowiedź na to pytanie.
Paweł Gościcki

W przypadku Vue v2 możesz użyć globalnego filtra vuejs.org/v2/api/#Vue-filter
Jaroslav Klimčík

Szybka, jasna odpowiedź, która działa w komponencie. Szacunek.
joshfindit

@ Paweł Gościcki czy na pewno filtry nie działają w Vue2? ponieważ dla mnie tak
Dave Howson

145

Jeśli Twój projekt to aplikacja jednostronicowa (np. Projekt stworzony przez vue init webpack myproject), to stwierdziłem, że ten sposób jest najbardziej intuicyjny i prosty:

W pliku main.js

import moment from 'moment'

Vue.prototype.moment = moment

Następnie w szablonie po prostu użyj

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

Powinien również działać dla innych typów aplikacji poza SPA.
iAmcR

Bardzo podoba mi się ta metoda korzystania z Momentu. Dzięki za udostępnienie! Właśnie go zaimplementowałem, ale z niewielką zmianą, jak sugerowano w dokumentacji, Vue.prototype. $ Moment = moment. vuejs.org/v2/cookbook/adding-instance-properties.html .
Josh

Proste, ale nie możesz mieć rozpoznawania typów w kodzie VS.
Alvin Konda

28

W twoim package.jsonw "dependencies"chwili section Dodaj:

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

W komponencie, w którym chcesz wykorzystać moment, zaimportuj go:

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

W tym samym komponencie dodaj obliczoną właściwość:

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

A potem w szablonie tego komponentu:

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

1
Warto zauważyć, że jeśli zamiast używać funkcji bez parametrów, chcesz użyć funkcji takiej jak: date2day: function (date) {return moment(date).format('dddd')} Nie możesz użyć computedi powinieneś methodszamiast tego użyć .
andresgottlieb

13

Sprawiłem, że działało z Vue 2.0 w jednym komponencie pliku.

npm install moment w folderze, w którym zainstalowałeś 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>

Dlaczego metoda, dlaczego nie obliczona?
Serhii Matrunchyk

Do celów wyświetlania użyłem metody. Zapraszam do korzystania z własności obliczonej.
max

4

Oto przykład wykorzystujący zewnętrzną bibliotekę opakowującą dla Vue o nazwie vue-moment .

Oprócz wiązania instancji Moment z zakresem głównym Vue, ta biblioteka zawiera momenti durationfiltry.

Ten przykład obejmuje lokalizację i używa importu modułów ES6, oficjalnego standardu, zamiast wymagań systemu CommonJS firmy 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 });

Teraz możesz używać instancji Moment bezpośrednio w swoich szablonach Vue bez żadnych dodatkowych znaczników:

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

Lub filtry:

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

2
Do Twojej wiadomości: Ta odpowiedź została oznaczona jako niskiej jakości ze względu na jej długość i treść. Możesz go ulepszyć, wyjaśniając, jak to odpowiada na pytanie OP.
oguz ismail 2

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

Niezłe użycie wtyczek do izolowania rzeczy związanych z chwilą w osobnym pliku. Działa świetnie!
Pedro

0

Po prostu zaimportowałbym moduł moment, a następnie użyłby obliczonej funkcji do obsługi mojej logiki moment () i zwrócił wartość, do której odwołuje się szablon.

Chociaż nie korzystałem z tego i dlatego nie mogę mówić o jego skuteczności, znalazłem https://github.com/brockpetrie/vue-moment do alternatywnego rozważenia


0

moment vue

bardzo fajna wtyczka do projektu vue i działa bardzo płynnie z komponentami i istniejącym kodem. Ciesz się chwilami ... 😍

// 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")}}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.