vue.js - Vue 3 : component `:is` in for loop fails

标签 vue.js vuejs3

我正在尝试遍历 strings 描述的组件列表(我从另一个获取组件的名称,例如 const componentTreeName = ["CompA", "CompA"]

我的代码很简单:

<script setup>
    import CompA from './CompA.vue'
    import { ref } from 'vue'

    // I do NOT want to use [CompA, CompA] because my inputs are strings
    const componentTreeName = ["CompA", "CompA"]
</script>

<template>
  <h1>Demo</h1>
  <template v-for="compName in componentTreeName">
    <component :is="compName"></component>
  </template>
</template>

Demo here

编辑

我试过了 this没有太大的成功。

最佳答案

使用resolveComponent()在组件名称上按名称查找全局组件:

<script setup>
import { resolveComponent, markRaw } from 'vue'
const myGlobalComp = markRaw(resolveComponent('my-global-component'))
</script>

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

demo 1

如果您混合使用本地和全局注册的组件,则可以使用查找本地组件,然后回退到 resolveComponent() 获取全局组件:

<script setup>
import LocalComponentA from '@/components/LocalComponentA.vue'
import LocalComponentB from '@/components/LocalComponentB.vue'
import { resolveComponent, markRaw } from 'vue'

const localComponents = {
  LocalComponentA,
  LocalComponentB,
}

const lookupComponent = name => {
  const c = localComponents[name] ?? resolveComponent(name)
  return markRaw(c)
}

const componentList = [
  'GlobalComponentA',
  'GlobalComponentB',
  'LocalComponentA',
  'LocalComponentB',
].map(lookupComponent)
</script>

<template>
  <component :is="c" v-for="c in componentList" />
</template>

demo 2

注意: markRaw用于组件定义,因为它不需要 react 性。

关于vue.js - Vue 3 : component `:is` in for loop fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71083006/

相关文章:

vue.js - 如何更改/覆盖 vuetify 中开关标签的默认颜色?

vue.js - 如何通过单击启用禁用的文本字段

javascript - Vue 3 - 在用作函数参数时设置组件及其 Prop 的类型

javascript - Webpack 'vue-loader' 编译问题与 '@vue/compiler-sfc'

javascript - Vue 3 axios发送formdata

html - 如何增加 v-if 显示的值?

javascript - Vuex 从状态加载现有表单数据以进行编辑

javascript - 如何使用方法更新 Vue.js 中的数组?

css - 如何在vuetify中使用动画素材图标

html - Vue 3 砖石布局与 Bootstrap 5 结合