Момент.js з Vuejs


128

Я намагаюся роздрукувати час дати, використовуючи, наприклад, наступне в vue-for

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

але, воно не з'являється. Це просто заготовка. Як я можу спробувати використати момент в vue?

Відповіді:


229

За допомогою вашого коду, vue.jsнамагається отримати доступ до moment()методу зі своєї області дії.

Отже, ви повинні використовувати такий метод:

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

Якщо ви хочете передати дату moment.js, я пропоную використовувати фільтри:

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

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

[демонстрація]


7
якщо ви використовуєте es6, не забувайте - імпортувати момент з 'моменту';
patie

2
Фільтри вимкнено у Vue 2+. Ви повинні використовувати обчислену властивість замість цього. Дивіться мою відповідь на це запитання.
Paweł Gościcki

Для Vue v2 ви можете використовувати глобальний фільтр vuejs.org/v2/api/#Vue-filter
Ярослав Клімчик

Швидка чітка відповідь, яка працює в складі. Повага.
joshfindit

@ PawełGościcki Ви впевнені, що фільтри не працюють у Vue2? бо для мене це роблять
Дейв Хоусон

145

Якщо ваш проект є додатком на одній сторінці (наприклад, створеним проектом vue init webpack myproject), я вважаю, що цей спосіб є найбільш інтуїтивним та простим:

В main.js

import moment from 'moment'

Vue.prototype.moment = moment

Потім у своєму шаблоні просто використовуйте

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

Потрібно також працювати з іншими видами додатків, крім SPA.
iAmcR

Мені дуже подобається цей метод використання Моменту. Дякую, що поділились! Я щойно реалізував це, але з невеликою зміною, як було запропоновано в документах, Vue.prototype. $ Moment = moment. vuejs.org/v2/cookbook/adding-instan-properties.html .
Джош

Просте, але ви не можете мати розпізнавання типів у коді VS.
Елвін Конда

28

У своєму package.jsonв "dependencies"розділі додайте момент:

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

У компонент, де ви хочете використовувати момент, імпортуйте його:

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

І в цей же компонент додайте обчислену властивість:

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

А потім у шаблоні цього компонента:

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

1
Варто зауважити, що якщо замість функції без параметрів, ви хочете використовувати функцію типу: date2day: function (date) {return moment(date).format('dddd')} Ви не можете використовувати computedта methodsзамість цього використовувати .
andresgottlieb

13

Я змусив його працювати з Vue 2.0 в одному файловому компоненті.

npm install moment у папці, де встановлено 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>

Чому метод, чому не обчислюється?
Сергій Матрунчик

Для відображення я використовував метод. Сміливо користуйтесь обчисленою властивістю.
макс

4

Ось приклад використання сторонньої бібліотеки обгортки для Vue, що називається vue-moment.

Крім прив’язки екземпляра Moment до кореневої області Vue, ця бібліотека включає momentі durationфільтри.

Цей приклад включає локалізацію та використовує імпорт модулів ES6, офіційний стандарт замість того, щоб вимагати системи модулів CommonJS.

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 });

Тепер ви можете використовувати екземпляр Moment безпосередньо у ваших шаблонах Vue без додаткової розмітки:

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

Або фільтри:

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

2
FYI: Ця відповідь була визнана неякісною через її довжину та зміст. Ви можете вдосконалити його, пояснивши, як це відповідає на питання ОП.
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

Приємне використання плагінів для виділення моменту, пов'язаного з моментом, в окремому файлі. Чудово працює!
Педро

0

Я просто імпортую модуль моменту, а потім використовую обчислену функцію для обробки моєї логіки moment () та повертає значення, на яке посилається в шаблоні.

Хоча я не використовував це і, отже, не можу говорити про його ефективність, я знайшов https://github.com/brockpetrie/vue-moment для альтернативного розгляду


0

vue-момент

дуже приємний плагін для проекту Vue і дуже гладко працює з компонентами та існуючим кодом. Насолоджуйтесь моментами ... 😍

// 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")}}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.