Khoảnh khắc với Vuejs


127

Tôi cố gắng in ra ngày giờ bằng cách sử dụng như sau trong vue-for

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

Nhưng, nó không xuất hiện. Nó chỉ là một khoảng trống. Làm thế nào tôi có thể cố gắng sử dụng khoảnh khắc trong vue?

Câu trả lời:


228

Với mã của bạn, họ vue.jsđang cố gắng truy cập moment()phương thức từ phạm vi của nó.

Do đó bạn nên sử dụng một phương pháp như thế này:

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

Nếu bạn muốn chuyển một ngày cho moment.js, tôi khuyên bạn nên sử dụng các bộ lọc:

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

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

[bản giới thiệu]


7
nếu sử dụng es6, đừng quên - nhập khoảnh khắc từ 'khoảnh khắc';
patie

2
Bộ lọc bị vô hiệu hóa trong Vue 2+. Bạn nên sử dụng một tài sản tính toán thay thế. Xem câu trả lời của tôi cho câu hỏi này.
Paweł Gościcki

Đối với Vue v2, bạn có thể sử dụng bộ lọc toàn cầu vuejs.org/v2/api/#Vue-filter
Jaroslav Klimčík

Nhanh chóng trả lời rõ ràng mà làm việc trong một thành phần. Sự tôn trọng.
joshfindit

@ PawełGościcki bạn có chắc chắn về các bộ lọc không hoạt động trong Vue2 không? bởi vì đối với tôi họ làm thế
Dave Howson

145

Nếu dự án của bạn là một ứng dụng trang đơn, (ví dụ: dự án được tạo bởi vue init webpack myproject), tôi thấy cách này là trực quan và đơn giản nhất:

Trong main.js

import moment from 'moment'

Vue.prototype.moment = moment

Sau đó, trong mẫu của bạn, chỉ cần sử dụng

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

Cũng nên làm việc cho các loại ứng dụng khác ngoài SPAs.
iAmcR

Tôi thực sự thích phương pháp sử dụng Moment này. Cám ơn vì đã chia sẻ! Tôi mới thực hiện nó nhưng với một thay đổi nhỏ như được đề xuất trong các tài liệu, Vue.prototype. $ Moment = khoảnh khắc. vuejs.org/v2/cookbook/adding-instance-properIES.html .
Josh

Đơn giản nhưng bạn không thể có nhận dạng kiểu trong mã VS.
Alvin Konda

28

Trong phần của bạn package.jsontrong "dependencies"phần thêm khoảnh khắc:

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

Trong thành phần mà bạn muốn sử dụng khoảnh khắc, hãy nhập nó:

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

Và trong cùng một thành phần, thêm một thuộc tính được tính toán:

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

Và sau đó trong mẫu của thành phần này:

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

1
Điều đáng chú ý là, thay vì sử dụng hàm không tham số, bạn muốn sử dụng một hàm như: date2day: function (date) {return moment(date).format('dddd')} Bạn không thể sử dụng computedvà nên sử dụng methodsthay thế.
andresgottlieb

12

Tôi đã làm cho nó hoạt động với Vue 2.0 trong thành phần tệp duy nhất.

npm install moment trong thư mục bạn đã cài đặt 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>

Tại sao phương pháp, tại sao không tính toán?
Serhii Matrunchyk

Đối với mục đích hiển thị, tôi đã sử dụng phương pháp. Hãy sử dụng tài sản tính toán.
tối đa

4

Dưới đây là một ví dụ sử dụng thư viện trình bao bọc của bên thứ 3 cho Vue được gọi vue-moment .

Ngoài ràng buộc đối tượng Moment vào phạm vi gốc của Vue, thư viện này bao gồm momentdurationcác bộ lọc.

Ví dụ này bao gồm nội địa hóa và đang sử dụng nhập mô-đun ES6, một tiêu chuẩn chính thức, thay vì hệ thống mô-đun CommonJS của NodeJS yêu cầu.

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

Bây giờ bạn có thể sử dụng phiên bản Moment trực tiếp trong các mẫu Vue của mình mà không cần thêm bất kỳ đánh dấu nào:

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

Hoặc các bộ lọc:

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

2
FYI: Câu trả lời này được gắn cờ là chất lượng thấp vì độ dài và nội dung của nó. Bạn có thể muốn cải thiện nó bằng cách giải thích cách trả lời câu hỏi của 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

Sử dụng tốt các plugin để tách biệt các nội dung liên quan đến thời điểm trong một tệp riêng biệt. Hoạt động tuyệt vời!
Pedro

0

Tôi chỉ cần nhập mô-đun khoảnh khắc, sau đó sử dụng hàm được tính toán để xử lý logic khoảnh khắc () của tôi và trả về giá trị được tham chiếu trong mẫu.

Mặc dù tôi chưa sử dụng điều này và do đó không thể nói về hiệu quả của nó, tôi đã tìm thấy https://github.com/brockpetrie/vue-moment để xem xét thay thế


0

khoảnh khắc

plugin rất đẹp cho dự án vue và hoạt động rất trơn tru với các thành phần và mã hiện có. Tận hưởng những khoảnh khắc ... 😍

// 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")}}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.