所以我的vue3项目有问题。要点:我需要为某些用例支持不同的布局:授权、用户配置文件的布局、组的布局等。我通过这种方式得到了机会:
- 创建
AppLayout.vue
用于管理布局的组件
<template>
<component :is="layout">
<slot />
</component>
</template>
<script>
import AppLayoutDefault from "@/layouts/EmptyLayout";
import { shallowRef, watch } from "vue";
import { useRoute } from "vue-router";
export default {
name: "AppLayout",
setup() {
const layout = shallowRef(AppLayoutDefault);
const route = useRoute();
watch(
() => route.meta,
async (meta) => {
try {
const component =
await require(`@/layouts/${meta.layout}.vue`);
layout.value = component?.default || AppLayoutDefault;
} catch (e) {
layout.value = AppLayoutDefault;
}
}
);
return { layout };
},
};
</script>
- 所以我
App.vue
开始看起来如此
<template>
<AppLayout>
<router-view />
</AppLayout>
</template>
- 为了呈现特定的布局,我添加了路由器的
index.js
特殊标签meta
{
path: '/login',
name: 'LoginPage',
component: () => import('../views/auth/LoginPage.vue')
},
{
path: '/me',
name: 'MePage',
component: () => import('../views/user/MePage.vue'),
meta: {
layout: 'ProfileLayout'
},
},
- 现在我可以创建一些布局。例如,我制作
ProfileLayout.vue
了一些嵌套组件:页眉和页脚。我使用插槽来呈现动态页面内容。
<template>
<div>
<div class="container">
<Header />
<slot />
<Footer />
</div>
</div>
</template>
因此,当我键入 URL http://example.com/profile时,我会看到基于 ProfileLayout 的 Profile 页面的内容。这里的问题是:Profile page 调用 hooks 两次。
我放入console.log()
created() 钩子,我看到以下内容
这是问题,因为我在钩子中有一些请求,它们也执行了两次。我是vuejs的新手,对vue如何渲染组件不是很了解。我建议在代码内部调用重新渲染并再次创建配置文件页面。如何预防?