【问题标题】:Vue 3: implement dynamic layout rendering with composition api correctlyVue 3:使用组合 API 正确实现动态布局渲染
【发布时间】:2021-08-06 18:01:53
【问题描述】:

我正在尝试实现一种生成动态布局组件的好方法,这些组件会根据我的路由元设置而变化(如果路由有 meta: { layout: 'LayoutName' },它应该加载该布局,否则它会加载默认布局 MainLayout.vue) .

经过大量尝试和错误我设法让它工作

// My main App.vue file
<template>
    <component :is="layout">
        <router-view />
    </component>
</template>

<script setup>

import { defineAsyncComponent, computed } from 'vue'
import { useRoute } from 'vue-router';

let layout = computed( () => { 
        const { meta } = useRoute()
        return defineAsyncComponent( () => import(`./layouts/${meta.layout ?? 'MainLayout'}.vue`) )
    }
)

我的问题是:这种混合computeddefineAsyncComponent 的方式是否可取?

我尝试使用watchwatchEffect,但没有获得工作结果。你有什么建议吗?

【问题讨论】:

    标签: vue.js vue-router vue-composition-api


    【解决方案1】:

    兄弟,由于 webpack 导入无法计算 meta.layout,因此计算对你不起作用??并进行导入。 要解决此问题,请为布局创建一个单独的变量。类似的东西:

    layout(): ILayout {
      const { meta } = useRoute();
      const layoutName: TLayout = meta.layout ?? 'DefaultLayout';
      return defineAsyncComponent(
        () =>
          import(/* webpackChunkName: 'Layout' */ `@/layouts/${layoutName}.vue`)
      );
    }
    

    附:别管语法。我正在使用打字稿。

    【讨论】:

    • 谢谢,但是我使用 vite 而不是 webpack,我的示例运行良好,但是我随后在 vuejs 论坛上提问,我意识到解构 useRoute() 的结果并不是“最佳实践”定义变量时,最好不要调用{meta},而是使用route.meta(并在html上添加一个后备:&lt;component ... v-if="route.meta"&gt;,以避免闪烁的渲染)
    猜你喜欢
    • 2022-01-18
    • 2021-03-13
    • 1970-01-01
    • 2022-01-01
    • 2021-09-15
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多