为 Vue v3 导入 Vue-luxon - this.$luxon is not a function 错误

Importing Vue-luxon for Vue v3 - this.$luxon is not a function error

我已经尝试了所有我能想到的方法来让 vue-luxon 在我的 Laravel 8 / Vue 3 应用程序上运行,但失败得很惨。我根据文档执行了以下步骤:

npm install vue-luxon;

文档没有说明在哪里,但我把这句话放在我的 app.js 文件中:

import VueLuxon from "vue-luxon";

据我了解,这一行要改成App.use(VueLuxon),也放在app.js:

Vue.use(VueLuxon);  

并且(根据文档),就是这样......我应该可以打电话给:

this.$luxon("2020-10-05T14:48:00.000Z")

显示格式化日期,但我在控制台上不断收到此错误:

Uncaught TypeError: this.$luxon is not a function

这是我的 resources/js/app.js 文件的内容:

import { createApp } from 'vue';
import App from './components/App.vue'
import VueLuxon from "vue-luxon";

createApp({
    components: {
        App,
    }
}).mount("#app")

App.use(VueLuxon)

以及我的 js/components/App.vue 文件的内容:

<template>
<div class="flex flex--column flex--align-center flex--justify-center">
    <div class="logos">
        <img src="../../static/img/laravel.png" width="240" alt="" />
        <img src="../../static/img/vue.png" width="240" alt="" />
    </div>

    <div class="title">
        <h1 class="vue">Vue 3</h1>
        <h1 class="plus">+</h1>
        <h1 class="laravel">Laravel 8</h1>
    </div>

    {{ this.$luxon("2020-10-05T14:48:00.000Z") }}

</div>
</template>

<script>
// import VueLuxon from "vue-luxon"; // I´ve tried importing luxon here... doesn't work either.

export default {
    mounted() {
        console.log("Component mounted.");
    },
};
</script>

我试过将导入直接放在组件上,注册为应用程序组件,或任何可能的组合,结果相同。我肯定遗漏了一些东西,所以任何帮助将不胜感激。

谢谢!

首先,你不用“这个”。在模板中。

根据官方存储库,此插件与 Vue 3 不兼容,仅与 Vue 2 兼容(至少目前如此)。

来源:https://github.com/casbloem/vue-luxon/issues/21

解决方案:

  1. 等待更新。
  2. 分叉此存储库(并在之后发出拉取请求)。
  3. 由于它在后台使用 luxon 库,因此请为其编写自己的包装器。 https://github.com/moment/luxon
  4. 寻找处理日期的替代方案。

你可以在 vue 3 中使用 globalProperties:

在你的main.js

const { DateTime } = require("luxon");
app.config.globalProperties.$luxonDateTime = DateTime;

然后在您的模板中:

<template>
{{ $luxonDateTime.fromISO("2020-10-05T14:48:00.000Z").toRelative() }}
</template>

你会得到“6 个月前”

对于 Vue3 你也可以试试:

import { App } from 'vue';
import {
    DateTime,
    Duration,
    Interval,
    ...
} from 'luxon'

type TLuxon = {
    DateTime: typeof DateTime,
    Duration: typeof Duration,
    Interval: typeof Interval,
    ...
} 

const luxon: TLuxon = {
    DateTime,
    Duration,
    Interval,
    ...
}

export default{
    install:(app: App) => {
        function load(): TLuxon{
            return luxon
        }
        app.config.globalProperties.$lx = load();
    }    
};

declare module "@vue/runtime-core" {
    //Bind to `this` keyword
    interface ComponentCustomProperties {
      $lx: TLuxon;
    }
}

然后在main.ts:

import luxonLoader from './modules/luxon/luxonLoader'
createApp(App)
    .use(store)
    .use(router)
    .use(luxonLoader)
    .mount('#app')

并且您可以在任何模板中使用 luxon:

<template>
  <div class="home">
    {{time}}
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
import HelloWorld from '@/components/HelloWorld.vue';

export default defineComponent({
  name: 'HomeView',
  components: {
    HelloWorld,
  },
  computed: {
    time(): string{
      let currentTime = this.$luxeon.DateTime.now().toString()
      return currentTime
    }
  }
});
</script>