如何在 vue 3 脚本设置中使用 <component :is="">

wit*_*ein 5 javascript vue.js vuejs3 vue-composition-api vue-script-setup

我正在使用实验脚本设置来创建学习环境。我有一个自制的导航栏,打开一个组件。

我在使用该<component :is="" />方法时遇到问题。此方法在组件基础 -> 动态组件下的文档中进行了描述

在 Vue 3 Composition API 中,它按预期工作:

<template>
  <NavigationBar
    @switchTab="changeTab"
    :activeTab="tab"
  />
  <component :is="tab" />
</template>

<script>
import { ref } from 'vue'
import NavigationBar from './components/NavigationBar.vue'
import TemplateSyntax from './components/TemplateSyntax.vue'
import DataPropsAndMethods from './components/DataPropsAndMethods.vue'

export default {
  components: {
    NavigationBar,
    TemplateSyntax,
    DataPropsAndMethods
  },
  setup () {
    const tab = ref('DataPropsAndMethods')
    function changeTab (newTab) {
      tab.value = newTab
    }

    return {
      changeTab,
      tab
    }
  }
}
</script>
Run Code Online (Sandbox Code Playgroud)

我的script setup失败方法:

<template>
  <NavigationBar
    @switchTab="changeTab"
    :activeTab="tab"
  />
  <component :is="tab" />
</template>

<script setup>
import NavigationBar from './components/NavigationBar.vue'
import TemplateSyntax from './components/TemplateSyntax.vue'
import DataPropsAndMethods from './components/DataPropsAndMethods.vue'
import { ref } from 'vue'

const tab = ref('DataPropsAndMethods')
function changeTab (newTab) {
  tab.value = newTab
}
</script>
Run Code Online (Sandbox Code Playgroud)

你知道如何用脚本设置方法解决这个问题吗?

ton*_*y19 5

这似乎与<script setup>tab需要引用组件定义本身,而不是该组件名称。

要引用不需要反应性的组件定义,请markRaw()在设置之前使用tab.value

<script setup>
import DataPropsAndMethods from './components/DataPropsAndMethods.vue'
import { ref, markRaw } from 'vue'

const tab = ref(null)

changeTab(DataPropsAndMethods)

// newTab: component definition (not a string)
function changeTab (newTab) {
  tab.value = markRaw(newTab)
}
</script>
Run Code Online (Sandbox Code Playgroud)

演示 1

如果您需要将组件名称传递给changeTab(),您可以使用查找:

<script setup>
import DataPropsAndMethods from './components/DataPropsAndMethods.vue'
import { ref, markRaw } from 'vue'

const tab = ref(null)

changeTab('DataPropsAndMethods')

// newTab: component name (string)
function changeTab (newTab) {
  const lookup = {
    DataPropsAndMethods,
    /* ...other component definitions */
  }
  tab.value = markRaw(lookup[newTab])
}
</script>
Run Code Online (Sandbox Code Playgroud)

演示 2

3.0.9使用 Vue CLI使用 Vue设置进行测试5.0.0-alpha.8