Moment.js dengan Vuejs

128

Saya mencoba mencetak waktu tanggal menggunakan seperti berikut ini di vue-for

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

tapi, itu tidak muncul. Itu hanya kosong. Bagaimana saya bisa mencoba menggunakan moment in vue?

Atur Kyar Wa Lar
sumber

Jawaban:

229

Dengan kode Anda, vue.jsmencoba mengakses moment()metode dari cakupannya.

Karenanya Anda harus menggunakan metode seperti ini:

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

Jika Anda ingin melewatkan tanggal ke moment.js, saya sarankan untuk menggunakan filter:

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

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

[demo]

Peslis Pantelis
sumber
7
jika menggunakan es6, jangan lupa - impor momen dari 'momen';
patie
2
Filter dinonaktifkan di Vue 2+. Anda harus menggunakan properti yang dihitung sebagai gantinya. Lihat jawaban saya untuk pertanyaan ini.
Paweł Gościcki
Untuk Vue v2 Anda dapat menggunakan filter global vuejs.org/v2/api/#Vue-filter
Jaroslav Klimčík
Jawaban cepat dan jelas yang bekerja di sebuah komponen. Menghormati.
joshfindit
@ PawełGościcki apakah Anda yakin tentang filter yang tidak berfungsi di Vue2? karena bagi saya mereka melakukannya
Dave Howson
145

Jika proyek Anda adalah aplikasi satu halaman, (misalnya proyek yang dibuat oleh vue init webpack myproject), menurut saya cara ini paling intuitif dan sederhana:

Di main.js

import moment from 'moment'

Vue.prototype.moment = moment

Kemudian di template Anda, cukup gunakan

<span>{{moment(date).format('YYYY-MM-DD')}}</span>
Geng Jiawen
sumber
Harus juga berfungsi untuk jenis aplikasi lain selain SPA.
iAmcR
Saya sangat suka metode penggunaan Momen ini. Terima kasih telah berbagi! Saya baru saja menerapkannya tetapi dengan perubahan kecil seperti yang disarankan di dokumen, Vue.prototype. $ Moment = moment. vuejs.org/v2/cookbook/adding-instance-properties.html .
Josh
Sederhana tetapi Anda tidak dapat memiliki pengenalan tipe dalam kode VS.
Alvin Konda
28

Dalam Anda package.jsondi "dependencies"saat bagian add:

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

Di komponen tempat Anda ingin menggunakan momen, impor:

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

Dan di komponen yang sama tambahkan properti yang dihitung:

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

Dan kemudian di template komponen ini:

<p>{{ timestamp }}</p>
Paweł Gościcki
sumber
1
Perlu dicatat bahwa jika, alih-alih menggunakan fungsi tanpa parameter, Anda ingin menggunakan fungsi seperti: date2day: function (date) {return moment(date).format('dddd')} Anda tidak dapat menggunakan computed, dan sebaiknya menggunakan methods.
andresgottlieb
13

Saya membuatnya bekerja dengan Vue 2.0 dalam komponen file tunggal.

npm install moment di folder tempat Anda menginstal 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>
maks
sumber
Mengapa metode, mengapa tidak dihitung?
Serhii Matrunchyk
Untuk tujuan tampilan, saya menggunakan metode. Jangan ragu untuk menggunakan properti yang dihitung.
maks
4

Berikut adalah contoh menggunakan pustaka pembungkus pihak ketiga untuk Vue yang dipanggil vue-moment.

Selain mengikat instance Moment ke dalam cakupan root Vue, library ini menyertakan momentdan durationmemfilter.

Contoh ini mencakup pelokalan dan menggunakan impor modul ES6, standar resmi, bukan yang dibutuhkan oleh sistem modul CommonJS 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 });

Sekarang Anda dapat menggunakan instance Moment langsung di template Vue Anda tanpa markup tambahan:

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

Atau filternya:

<span>{{ 3600000 | duration('humanize') }}</span>
<!-- "an hour" -->
<span>{{ [2, 'years'] | duration('add', 1, 'year') | duration('humanize') }}</span>
<!-- "3 years" -->
Atchutha rama reddy Karri
sumber
2
FYI: Jawaban ini ditandai sebagai berkualitas rendah karena panjang dan isinya. Anda mungkin ingin memperbaikinya dengan menjelaskan bagaimana ini menjawab pertanyaan 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
sumber
Penggunaan plugin yang bagus untuk mengisolasi hal-hal yang berhubungan dengan momen dalam file terpisah. Bekerja dengan baik!
Pedro
0

Saya cukup mengimpor modul momen, lalu menggunakan fungsi komputasi untuk menangani logika momen () saya dan mengembalikan nilai yang direferensikan di template.

Meskipun saya belum menggunakan ini dan karenanya tidak dapat berbicara tentang efektivitasnya, saya menemukan https://github.com/brockpetrie/vue-moment untuk pertimbangan alternatif

CodeFromthe510
sumber
0

vue-moment

plugin yang sangat bagus untuk proyek vue dan bekerja sangat lancar dengan komponen dan kode yang ada. Nikmati saat-saat ... 😍

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