Moment.js与Vuejs


127

我尝试使用以下方式打印日期时间 vue-for

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

但是,它不会出现。只是一片空白。我该如何尝试利用当下的瞬间?

Answers:


228

对于您的代码,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,请不要忘记-从'moment'导入时刻;
patie 2016年

2
在Vue 2+中禁用了过滤器。您应该改为使用计算属性。请参阅我对这个问题的回答。
帕维尔Gościcki

对于Vue v2,您可以使用全局过滤器vuejs.org/v2/api/#Vue-filter
JaroslavKlimčík16

快速清晰的答案适用于组件。尊重。
joshfindit

@PawełGościcki您确定过滤器在Vue2中不起作用吗?因为对我而言,他们这样做
Dave Howson

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

我真的很喜欢这种使用Moment的方法。感谢分享!我刚刚实现了它,但是做了一点改动,如文档中所建议的那样,Vue.prototype。$ moment = moment。vuejs.org/v2/cookbook/adding-instance-properties.html
乔什

很简单,但是您无法在VS代码中进行类型识别。
Alvin Konda

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 17-4-4

12

我在单个文件组件中将其与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>

为什么用方法,为什么不计算?
Serhii Matrunchyk

出于显示目的,我使用了方法。随意使用计算属性。
最多

4

这是一个使用名为Vue的第三方包装器库的示例vue-moment

除了将Moment实例绑定到Vue的根范围外,该库还包括momentduration过滤器。

该示例包括本地化,并且使用的是官方标准ES6模块导入,而不是NodeJS的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 });

现在,您可以直接在Vue模板中使用Moment实例,而无需任何其他标记:

<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
仅供参考:由于答案的长度和内容,该答案被标记为低质量。您可能需要通过解释如何回答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

很好地使用插件将与时刻相关的内容隔离在一个单独的文件中。很棒!
佩德罗


0

时刻

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")}}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.