使用vue-router导航时未找到/加载JavaScript包

h7wcgrx3  于 2023-01-14  发布在  Vue.js
关注(0)|答案(1)|浏览(200)

我正在构建一个使用vue-router的Vue3应用程序。我初始化了<router-view />组件和必要的router-links。当我单击<router-link>元素时,我被带到相应的页面,但我使用的JavaScript模块(apexchartsfontawesome,...)没有加载。
<i>元素就是这样一个例子,fontawesome包应该将其呈现为一个图标,下面是我的源代码片段,我在其中使用了这个元素:

<i class="ti-trash"></i> Cancel

使用ChromeDevTools可以在HTML中找到<i>元素,但它没有呈现为图标,这是我希望发生的事情。
下面是我的源代码的相关片段:
main.js

import { createApp } from 'vue'
import Dashboard from '@/components/Dashboard.vue'
import InstanceCreationForm from '@/components/InstanceCreationForm.vue'
import { createRouter, createWebHistory } from 'vue-router'
import App from "@/App.vue";

const router = createRouter({
  history: createWebHistory(),
  routes: [
    {
      path: '/',
      component: Dashboard
    },
    {
      path: '/create-instance',
      component: InstanceCreationForm
    }
  ]
})

const app = createApp(App)

app.use(router)
app.mount('#app')

Dashboard.vue

<template>
    <main-template>
        <template v-slot:content>
            <router-link to="/create-instance">
                Add New
            </router-link>
        </template>
    </main-template>
</template>


<script>
import "../js/vendors.min.js" //  <--  Contains jQuery, fontawesome
import "../assets/icons/feather-icons/feather.min.js"
import "../assets/vendor_components/apexcharts-bundle/dist/apexcharts.js"
import "../js/demo.js"
import "../js/jquery.smartmenus.js"
import "../js/menus.js"
import "../js/template.js"
import "../js/pages/dashboard.js"

import MainTemplate from "@/components/MainTemplate.vue";

export default {
    name: "Dashboard",
    extends: MainTemplate,
    components: {MainTemplate}
    metaInfo: {
        script: [
            {src: "https://cdn.amcharts.com/lib/4/core.js", async: true, defer: true},
            {src: "https://cdn.amcharts.com/lib/4/charts.js", async: true, defer: true},
            {src: "https://cdn.amcharts.com/lib/4/themes/animated.js", async: true, defer: true},
        ]
    }
}
</script>

InstanceCreationForm.vue

<template>
    <main-template>
        <template v-slot:content>
            <router-link to="/" id="cancel-button" type="button">
              <i class="ti-trash"></i> Cancel
            </router-link>
        </template>
    </main-template>
</template>

<script>
import MainTemplate from "@/components/MainTemplate.vue";

export default {
    name: "InstanceCreationForm",
    components: {MainTemplate},
    extends: MainTemplate,
}
</script>

我可以通过使用锚标记(<a>)在路由之间重定向来解决这个问题,但是每次用户移动页面时重新加载整个页面感觉效率很低。我能找到的唯一其他解决方案是在页面加载时强制重新加载组件,这也能有效地做同样的事情。
为什么我的JavaScript包在vue-router重定向时无法加载?

wwwo4jvm

wwwo4jvm1#

我找到答案了!
解决方案是在安装组件后将库添加为<src>标记:
MainTemplate.vue

import "../js/vendors.min.js"
import "../assets/icons/feather-icons/feather.min.js"
import "../assets/vendor_components/apexcharts-bundle/dist/apexcharts.js"
import "../js/demo.js"
import "../js/jquery.smartmenus.js"
import "../js/menus.js"
import "../js/template.js"

export default {
name: "MainTemplate",
methods: {
    loadLibrary(libraryPath) {
        let newScript = document.createElement('script')
        newScript.setAttribute('src', libraryPath)
        document.head.appendChild(newScript)
    }
},
mounted() {
    if (this.$options.name === 'MainTemplate') {
        this.loadLibrary("/src/js/vendors.min.js")
        this.loadLibrary("/src/assets/icons/feather-icons/feather.min.js")
        this.loadLibrary("/src/assets/vendor_components/apexcharts-bundle/dist/apexcharts.js")
        this.loadLibrary("/src/js/demo.js")
        this.loadLibrary("/src/js/jquery.smartmenus.js")
        this.loadLibrary("/src/js/menus.js")
        this.loadLibrary("/src/js/template.js")
    }
}
}

我选择将此代码放在我的MainTemplate中(因为我的其他组件都是从它扩展而来的),而不是在每个模板中使用它。
我还保留了原始的import语句,以便它们在站点第一次加载时运行。

相关问题