【问题标题】:Vue <script setup> - how to deal with multiple dynamic components?Vue <script setup> - 如何处理多个动态组件?
【发布时间】:2021-11-13 04:36:02
【问题描述】:

下面的Options API代码好像不能转换成&lt;script setup&gt;

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

结果:

&lt;script setup&gt; 选项不加载任何布局,而仅加载 &lt;default&gt;&lt;dark&gt;&lt;light&gt; 块,例如:

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

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

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

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

有什么想法吗?

【问题讨论】:

  • :is="route.meta.layout || 'defaultLayout'":is="route.meta.layout ? route.meta.layout : 'defaultLayout'" 怎么样
  • 我有一个类似的问题,关于使用component :is=""script setupHope it will help you
  • @BoussadjraBrahim 做到了。没有运气

标签: vue.js vue-component vuejs3


【解决方案1】:

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

    <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 并且可以通过它的名称(字符串键)解析,但使用 &lt;script setup&gt; 组件使用 directly without registration,因此无法使用 string 键来解析它们。 ..

【讨论】:

  • 如果我不想使用computed,如何在模板中直接使用?
猜你喜欢
  • 1970-01-01
  • 2022-09-25
  • 2022-08-09
  • 2021-01-07
  • 2021-10-27
  • 2021-09-23
  • 1970-01-01
  • 2019-08-11
  • 2017-04-15
相关资源
最近更新 更多