如何在VueRouter@4.0.0(Vue3)中使用创建异步组件?

von4xj4u  于 2023-01-05  发布在  Vue.js
关注(0)|答案(3)|浏览(181)

当我像这样填充createRouter()中的component字段时:

{
    path: '/article/post',
    name: 'article-post',
    component: defineAsyncComponent({
      loader: () => import('@/views/article-post/index.vue'),
      loadingComponent: () => import('@/views/article-post/skeleton.vue'),
    }),
},

看起来它不工作。什么我想让它显示一个加载页面时,实际页面正在加载。
我该怎么做呢?

g2ieeal7

g2ieeal71#

loadingComponent值必须是组件定义,并且其本身不能是异步组件:

import { createRouter } from 'vue-router'
import { defineAsyncComponent } from 'vue'
import Skeleton from '@/views/article-post/skeleton.vue'

export default createRouter({
  routes: [
    {
      path: '/article/post',
      name: 'article-post',
      component: defineAsyncComponent({
        loader: () => import('@/views/article-post/index.vue'),
        //loadingComponent: () => import('@/views/article-post/skeleton.vue'), ❌ cannot be dynamic import
        loadingComponent: Skeleton ✅
      }),
    },
  ]
})

还要注意的是,加载组件(Skeleton)只显示一次,也就是说,如果组件定义还没有在缓存中的话。这个Codesandboxloader()中添加了一个人为的延迟来演示。

du7egjpx

du7egjpx2#

可以按如下方式异步加载组件:

{
    path: '/article/post',
    name: 'article-post',
    component: () => ({
        component: import('@/views/article-post/index.vue')
        loading: import('@/views/article-post/skeleton.vue')
    })
},
svdrlsy4

svdrlsy43#

Note
不要对路由使用异步组件。异步组件仍然可以在路由组件内部使用,但路由组件本身只是动态导入。

相关问题