当前位置: 首页 > 知识库问答 >
问题:

vue3 - Vue3中v-for循环遍历<component></component>引入的组件为何未能加载?

陆昂然
2024-03-10

在vue3中,使用v-for循环遍历的方式<component></component>无法加载组件

<template><div><div v-for="item in comList " :key="item.id"><component :is="item.comName" /></div></div></template><script setup>import OneCom from "./one-com";import {ref} fromm vue;const comList = ref([{id: 1,comName:"OneCom "}])</script>

如果不通过遍历能正常加载出组件

<template><div><component is="OneCom" /></div></template><script setup>import OneCom from "./one-com";import {ref} fromm vue;const comList = ref([{id: 1,comName:"OneCom "}])</script>

共有2个答案

公良育
2024-03-10

将组件本身传递给 is 而不是其名称,则不需要注册:

import OneCom from './one-com.vue'import { ref, markRaw } from 'vue'const comList = ref([{ id: 1, comName: markRaw(OneCom) }])

如果想通过名称传递则必须先对其进行注册:

<script setup>import OneCom from './one-com.vue'import { defineComponent, ref } from 'vue'const comList = ref([{ id: 1, comName: 'OneCom' }])</script><script>export default defineComponent({  components: { OneCom }})</script>
朱鸿畅
2024-03-10

Vue 3 中的 <component :is="..."> 是用于动态组件的,这意味着它的 is 属性应该绑定到一个组件对象,而不是组件的名字或字符串。在你的例子中,你试图将 item.comName(一个字符串)传递给 :is 属性,这是不正确的。

如果你想要通过名字动态加载组件,你需要使用 defineAsyncComponentcreateAppresolveComponent 方法来解析组件名并获取组件对象。然而,请注意,这需要你的组件是全局注册的,或者你需要有一个从组件名到组件对象的映射。

这是一个例子,展示了如何使用 defineAsyncComponent 来动态加载组件:

<template>  <div>    <div v-for="item in comList" :key="item.id">      <dynamic-component :component="item.comName" />    </div>  </div></template><script setup>import { defineAsyncComponent } from 'vue';import OneCom from "./one-com";import { ref } from 'vue';const comList = ref([  { id: 1, comName: OneCom }]);const DynamicComponent = {  name: 'DynamicComponent',  props: {    component: {      type: Object,      required: true    }  },  render(h) {    return h(this.component);  }};const dynamicComponent = defineAsyncComponent(() => ({  loader: () => import(`./${comList.value[0].comName}`),  loadingComponent: 'LoadingComponent',  errorComponent: 'ErrorComponent',  delay: 200,  timeout: 3000}));</script>

在这个例子中,comList 是一个对象数组,每个对象都有一个 comName 属性,该属性的值是组件对象。然后,我们创建了一个名为 DynamicComponent 的新组件,它接受一个 component 属性,并使用该属性来渲染动态组件。最后,我们使用 defineAsyncComponent 来创建一个新的异步组件,该组件在加载时会尝试导入与 comList 中的组件对象对应的组件。

请注意,这只是一个基本示例,你可能需要根据你的具体需求进行修改。例如,如果你的组件在不同的目录中,你可能需要修改 import 语句以正确地解析组件的路径。此外,你还需要处理加载和错误状态,如示例中的 LoadingComponentErrorComponent

如果你不想使用 defineAsyncComponent,你还可以考虑使用全局注册或局部注册的组件映射来通过组件名获取组件对象。然而,这可能需要你更改你的组件注册方式,并可能使你的代码更难维护。

 类似资料:
  • 我有个需求需要使用动态组件展示,但是我挂载ref到component上,好像不会立即起作用,即使我使用nextTick?所以component是否支持绑定ref?

  • 组件是 Yii 应用的主要基石。是 yii\base\Component 类或其子类的实例。 三个用以区分它和其它类的主要功能有: 属性(Property) 事件(Event) 行为(Behavior) 或单独使用,或彼此配合,这些功能的应用让 Yii 的类变得更加灵活和易用。 以小部件 yii\jui\DatePicker 来举例, 这是个方便你在 视图 中生成一个交互式日期选择器的 UI 组件

  • 在entity-component-system pattern里,组件是一个可重用和模块化的数据块,我们将其插入到一个实体中,以添加外观、行为和/或功能。 在A-Frame中,组件修改场景中的三维对象实体。我们将组件组合在一起构建复杂对象。组件让我们把three.js和JS代码封装进模块里,以便于在HTML以声明的方式进行使用。 作为一个抽象的类比,如果我们把智能手机定义为一个实体,我们就可以使

  • 这是问题的一个动图。 这是问题的现场 https://play.vuejs.org/#eNp9VE2Pm0AM/SsWl5CWJR9HSqKuVFWqVKlVK... 问题描述: 当有两行时,在第一行后插入一行,input 的内容却保持位置不变,如何修复这个问题? 比如这个例子,当 input 内的内容依次是 1、2 时,我再在第一行后插入一行,我期望的是,第一个 input = 1,第二个 in

  • 问题内容: 以下是提供输出的代码段:。由于访问列表中的数字3,我期望获得输出。在线给出的解释是“每次迭代中更改的价值”,但我不太了解如何或为什么。任何解释都很好! 问题答案: 这里发生的是一个列表在循环过程中发生了变异。 让我们考虑以下代码片段: 输出为: 每次迭代: 从内部指针当前指向的位置读取值 立即将其分配给列表中的最后一个元素 在最后一个元素打印在标准输出上之后 就像这样: 内部指针指向第

  • v-for循环组件,组件key都是同一个固定值,组件还会被重新创建吗 v-for循环组件,内部组件每次的生命周期都是从beforeCreated开始的吗