vue3 动态加载组件以及解决vite import报警告 The above dynamic import cannot be analyzed by Vite 的问题

本文介绍了如何在Vue3中使用defineAsyncComponent实现动态加载组件,同时处理了在vite环境下可能遇到的警告,并提供了两种不同的加载器方法:一种是传统的import方式,另一种是利用vite的新glob方法。
摘要由CSDN通过智能技术生成

在某些地方我们并不希望把组件都注册到router通过路由访问,或者多个小组件在一次引入,这个时候动态加载便有了用处
vue3有了新的异步加载组件的方法 defineAsyncComponent

采用原来的import方法(在vite某些版本中会出现警告)

在这里插入图片描述

解决这个报错 请看 解决方法

下面是动态组件加载方案

<!-- 动态加载某个组件 -->
<template>
  <component v-if="VIEW" :is="VIEW" :query="query"></component>
  <div v-else>
    now Loading......
  </div>
</template>

<script setup>
import { shallowRef, defineAsyncComponent } from 'vue';
// 让组件支持mvvm
const VIEW = shallowRef(null)

// 参数传递
const props = defineProps({
  // 需要加载的组件路径    从views/开始   例子:views/page/index.vue
  path: {
    type: String,
    default: ''
  },
  // 需要再次给组件传递的参数 可以按照需要替换成其他参数
  query: {
    type: Object,
    default: {}
  }
})

// 尝试加载的地址是否可以获取组件 获取成功则赋值,失败就到错误页面
loader(props.path).then(() => { VIEW.value = defineAsyncComponent(() => loader(props.path)) }).catch(() => { VIEW.value = defineAsyncComponent(() => loader('views/err/index.vue')) })
// 加载器
function loader(path) {
  // 这里只能使用../的模式,具体多少个../需要看这个组件的位置需要几级才能才能访问到你需要加载的组件
  return import(`../../${path}`)
}
</script>

<style lang="scss" scoped></style>

采用vite推荐方法

<template>
  <component v-if="VIEW" :is="VIEW" :query="query"></component>
  <div v-else>
    now Loading......
  </div>
</template>

<script setup>
import { shallowRef, defineAsyncComponent } from 'vue';
// 让组件支持mvvm
const VIEW = shallowRef(null)
// 获取可能用到的组件 据说说vite提供的新方法
// 使用vite新方法开始
const modules = import.meta.glob("../../views/**/**.vue")
// 使用vite新方法结束

// 参数传递
const props = defineProps({
  // 需要加载的组件路径    从views/开始   例子:views/page/index.vue
  path: {
    type: String,
    default: ''
  },
  // 需要再次给组件传递的参数 可以按照需要替换成其他参数
  query: {
    type: Object,
    default: {}
  }
})

// 调用加载
loader()
// 加载器
function loader() {
  // 这里只能使用../的模式,具体多少个../需要看这个组件的位置需要几级才能才能访问到你需要加载的组件
  VIEW.value = modules[`../../${props.path}`] ? defineAsyncComponent(modules[`../../${props.path}`]) : defineAsyncComponent(modules[`../../err/index.vue`])
}
</script>

<style lang="scss" scoped></style>

调用组件

<template>
    <loadView :path="'views/normalTool/components/cupInterval.vue'" :query="{}"/>
</template>

<script setup>
import loadView from '@/components/public/loadView.vue'
</script>

<style lang="scss" scoped></style>
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值