vue.js - Vue <script setup> - 如何处理多个动态组件?

标签 vue.js vue-component vuejs3

下面的Options API代码似乎无法转换为<script setup> :

    <template>
      <div>
        <component :is="layout">
          <router-view/>
        </component>
      </div>
    </template>
    
    <script>
    const defaultLayout = 'default'
    
    import Dark from './layouts/dark.vue'
    import Light from './layouts/light.vue'
    import Default from './layouts/default.vue'
    
    export default {
      name: 'App',
    
      components: {
        Dark,
        Light,
        Default
      },
    
      computed: {
        layout () {
          return (this.$route.meta.layout || defaultLayout)
        }
      }
    }
    </script>

我的尝试:

    <script setup>
    import { computed } from 'vue'
    import { useRouter, useRoute } from 'vue-router'
    
    import Dark from './layouts/dark.vue'
    import Light from './layouts/light.vue'
    import Default from './layouts/default.vue'
    
    const router = useRouter()
    const route = useRoute()
    
    const defaultLayout = 'default'
    const layout = computed(() => route.meta.layout || defaultLayout )
    </script>

结果:

<script setup> 没有加载布局选项,但只是一个 <default> , <dark> , 或 <light> block ,例如:

    <div id="app">
    <default>
    ...
    ...
    </default>
    </div>

根据文档 here ,我们可以使用三元:

    <component :is="someCondition ? Foo : Bar" />

但这并不理想。因为您可能有超过 2 个动态组件需要解决。我们不能让三元组太长。我们可以吗?

有什么想法吗?

最佳答案

诀窍是返回引用的变量而不是它的名称。

    <script setup>
    import { computed } from 'vue'
    import { useRouter, useRoute } from 'vue-router'
    
    import Dark from './layouts/dark.vue'
    import Light from './layouts/light.vue'
    import Default from './layouts/default.vue'
    
    const router = useRouter()
    const route = useRoute()
    
    const layouts = {
      default: Default,
      light: Light,
      dark: Dark
    };
    
    const defaultLayout = 'default'
    const layout = computed(() => layouts[route.meta.layout || defaultLayout] )
    </script>

原因

虽然选项 API 组件是 registered locally并且可以通过它的名称(字符串键)来解析,<script setup>使用的组件directly without registration所以不能使用string解决它们的关键...

关于vue.js - Vue &lt;script setup> - 如何处理多个动态组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69237991/

相关文章:

javascript - 如何将 Vuex 方法式访问迁移到 Pinia 设置商店

javascript - 使用 VueJS 在 Google map 上明确指示

node.js - 微前端应用

javascript - Vue js 动态数据组件

javascript - 在Vuejs3中如何让sticky header组件在与其他组件相交时改变背景颜色?

vue.js - 如何设置 `vite-plugin-pages`,找不到模块 `~pages`

javascript - 绑定(bind)到数组在 vue 实例中不起作用

javascript - VueJS 在 IE11 中的第一次输入时不会触发输入事件

javascript - 如何在 BootstrapVue 轮播中包含图像?

javascript - 尝试保存 .vue 文件