我用实验script setup来创造一个学习环境.我有一个brew 的导航栏,打开了一个组件.

我在使用<component :is="" />方法时遇到困难.这种方法在component basics -> dynamic-components以下的文档中有描述

在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>

My approach with the 100 fails:

<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>

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

推荐答案

似乎对于<script setup>tab需要引用组件定义本身,而不是组件名称.

参考不需要react 性的组件定义,在设置tab.value之前使用markRaw():

<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>

demo 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>

demo 2

Tested with Vue 100 setup with Vue CLI 101

Vue.js相关问答推荐

VueJS不会呈现一个名为None的组件""

Nuxt.js i18n不提供默认区域设置中的页面而不重定向

无法从CDN使用Vue和PrimeVue呈现DataTable

Vue.js 3 没有组件的实例?

Vuetify 复选框未正确显示值

vue 不重新渲染数据更改

Svelte 中的简单react 性实验以意想不到的方式失败了. Vue 等效项没有

为什么将 name 与 router-link 一起使用比仅使用 to 与 path 更好?

使用 Vue.js 将文件输入绑定到按钮

Vue-tables-2(vuex)react性不起作用

vue.js 在 App.vue 中获取路由名称

如何使用 TypeScript 在 Vue.js 中指定非react性实例属性?

如何使用 VueJS / Typescript 导入 JSON 文件?

从 vue.js 中的 store 获得的计算(computed)属性的设置器

将 SignalR 与 Vue.js 和 Vuex 集成

过渡后的 v-if 下方的过渡元素

使用 axios 和 vue.js 取消先前的请求

Vue js在列表中添加动态字段,删除和排序不起作用

Axios 捕获错误请求失败,状态码 404

使用 svelte js 的原因