为 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
解决方案:
- 等待更新。
- 分叉此存储库(并在之后发出拉取请求)。
- 由于它在后台使用 luxon 库,因此请为其编写自己的包装器。 https://github.com/moment/luxon
- 寻找处理日期的替代方案。
你可以在 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>
我已经尝试了所有我能想到的方法来让 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
解决方案:
- 等待更新。
- 分叉此存储库(并在之后发出拉取请求)。
- 由于它在后台使用 luxon 库,因此请为其编写自己的包装器。 https://github.com/moment/luxon
- 寻找处理日期的替代方案。
你可以在 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>