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?

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]


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>

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>

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>

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

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

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


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")}}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.