关于异步组件的loading问题
发布于 3 年前 作者 huaer 2088 次浏览 来自 问答
粉丝福利 : 关注VUE中文社区公众号,回复视频领取粉丝福利

我有一个函数用来创建异步组件

function asyncComponentsFactory(component) {
  return {
    // 需要加载的组件 (应该是一个 `Promise` 对象) webpack不支持import函数使用变量来动态引入
    component,
    // 异步组件加载时使用的组件 除非是从远程服务器加载组件或者组件特别大,用户网速又特别慢,否则应该是看不到的
    loading: LoadingComponent,
    // 加载失败时使用的组件
    error: ErrorComponent,
    // 展示加载时组件的延时时间。默认值是 200 (毫秒)
    delay: 200,
    // 如果提供了超时时间且组件加载也超时了,
    // 则使用加载失败时使用的组件。默认值是:`Infinity`
    timeout: 10 * 1000
  }
}

之后创建了一个组件映射关系,把名字映射到某个具体的组件

componentMap = {
'AComponent': {
    component: () => asyncComponentsFactory(import('@/components/ACompoent'))
  },

'BComponent': {
    component: () => asyncComponentsFactory(import('@/components/BCompoent'))
  },
}

之后通过动态组件的is属性来动态加载组件

<component :is="component"></component>

component = componentMap.AComponent

我简单封装了一下,只要传进去名字就可以实现动态加载相应的组件

事实上也确实能正常工作,网速慢的时候会出现loading,加载错误会出现error

但是偶尔会出现一种情况,那就是组件已经正常加载完成了,但是loading组件依然一直展示,并没有在组件加载完成后消失

我没有办法100%重现,偶尔出现,一刷新又没有了,我现在只好先把loading注释掉了,一切都正常工作,只是网速慢的时候不会出现loading了

不知道有没有人遇到与我类似的情况

回到顶部