news 2026/5/23 22:13:58

动态组件驱动的标签页架构(简单来说:一个页面包含许多Tabs页面,这些Tabs页面渲染逻辑)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动态组件驱动的标签页架构(简单来说:一个页面包含许多Tabs页面,这些Tabs页面渲染逻辑)

整体渲染思路:

1. TabMenu创建 → 解析路由配置 → 生成tabPanes数据
2. TabPanes接收数据 → 遍历创建el-tab-pane
3. 用户点击标签 → activeName改变
4. Vue发现activeName匹配 → 调用对应的componentName函数
5. loadView执行 → require()加载组件文件
6. 组件加载完成 → 渲染到页面
7. keep-alive缓存 → 切换时保持状态

// TabMenu.vue <template> <div> <TabPanes :key="$route.path" :tabPanes.sync="tabPanes" /> </div> </template> <script> import TabPanes from "@/components/TabPane/tab-pane"; function loadView(view) { return resolve => require([`@/views/${view}`], resolve); } export default { components: { TabPanes }, data() { return { tabPanes: null }; }, created() { this.init(); }, methods: { init() { const tabs = this.$route.meta.tabs; this.tabPanes = tabs.map(item => { return { title: item.name, name: item.code, componentName: loadView([item.component]) }; }); } }, watch: { "$route.path": function(newVal, oldVal) { this.init(); } } }; </script>
// tab-pane.vue <template> <el-tabs v-model="activeName" :type="tabType" @tab-click="tabClick" class="tab-panes" > <template> <el-tab-pane v-for="(tab, index) in tabPanes" :key="tab.title+index" :label="tab.title" :lazy="true" :name="tab.name" > <keep-alive> <component class="content" v-if="activeName === tab.name" :is="tab.componentName" /> </keep-alive> </el-tab-pane> </template> </el-tabs> </template> <script> //这是tabPane要显示的组件 export default { name: "TabPanes", props: { tabPanes: { type: Array, default: () => [] }, tabType: { type: String, default: "" } }, data() { return { activeName: null }; }, created() { this.setActiveTab(); }, mounted(){ this.setActiveTab(); }, watch: { activeName: { handler(val) { if (val) { this.$router.replace({ query: { tab: val }, params: { ...this.$route.params } }); } }, }, "$route.query.tab"(val) { this.activeName = val || ''; }, tabPanes: { handler(val) { if (val.length > 0 && !this.$route.query.tab) { this.activeName = val[0].name; } } }, }, methods: { setActiveTab() { const tabFromQuery = this.$route.query.tab; const isValidTab = tabFromQuery && this.tabPanes.some(tab => tab.name === tabFromQuery); this.activeName = isValidTab ? tabFromQuery : (this.tabPanes[0] && this.tabPanes[0].name || ''); }, tabClick(tab) { this.activeName = tab.name; }, } }; </script> <style lang="scss" scoped> .el-tabs { position: absolute; inset: 0; overflow: overlay; & ::v-deep .el-tabs__header { padding: 0; position: relative; margin: 0 0 0 10px; border-top: 1px solid #bfcbd9; } & ::v-deep .el-tabs__nav-wrap { background-color: #fff !important; padding-left: 10px; } &::-webkit-scrollbar { width: 10px; background: transparent; } &::-webkit-scrollbar-thumb { border-radius: 9px; background-color: #c0c0c0; } } </style>

TabMenu.vue 是在哪里被调用的?
结论:TabMenu.vue 不是在前端代码中直接调用的,而是通过后端返回的动态路由配置来加载的!


整个过程是:
1.用户访问某个URL(比如 /xxx )
2.权限系统检查用户是否有该页面权限
3.后端返回菜单配置,其中包含:

{
"path": "/xxx",
"component": "component/TabMenu",
"meta": {
"tabs": [
{"code": "xxx", "name": "tab页面名称", "component": "xx/xx/xx"}
]
}
}

4.前端动态加载 component/TabMenu.vue 组件
5.TabMenu执行,解析 meta.tabs 配置,渲染子页面

这就是为什么你找不到直接调用的原因!
TabMenu是动态路由系统的一部分,由后端菜单配置驱动,而不是在前端代码中硬编码引用的。

这种设计的优势:
权限灵活:可以动态控制谁可以访问哪些页面
菜单可配置:管理员可以配置页面结构,无需修改前端代码
组件按需加载:只在需要时才加载对应的Vue组件

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 21:53:10

无停顿 GC 实现原理:ZGC 如何做到毫秒级停顿?

在 Java 应用的性能优化领域&#xff0c;垃圾回收&#xff08;GC&#xff09;停顿始终是绕不开的“老大难”问题。对于金融交易、实时数据分析、高频交易等核心业务&#xff0c;即使是数百毫秒的停顿都可能引发系统超时、交易失败等严重后果。传统 GC 如 CMS、G1 虽在不断优化&…

作者头像 李华
网站建设 2026/5/21 10:22:16

IPX9KIP69K:IS0 20653:2006

IPX9K和IP69K是防护等级标准中的术语&#xff0c;ISO 20653:2006是规定其测试要求的相关标准&#xff0c;以下是具体介绍&#xff1a;IPX9K:是防水等级最高级别之一&#xff0c;适用于对防水要求较高的产品。它要求将样品暴露在高压高温水射流下从0、30、60和 90四个角度进行喷…

作者头像 李华
网站建设 2026/5/20 2:29:47

揭秘DOOM帧同步引擎:构建多人游戏核心架构的终极指南

揭秘DOOM帧同步引擎&#xff1a;构建多人游戏核心架构的终极指南 【免费下载链接】DOOM DOOM Open Source Release 项目地址: https://gitcode.com/gh_mirrors/do/DOOM 想要打造流畅的多人游戏体验&#xff1f;DOOM的开源版本为你展示了如何通过游戏网络同步技术中的帧同…

作者头像 李华
网站建设 2026/5/18 16:33:59

5个实战技巧:让你的网页内容一键变身专业PDF

5个实战技巧&#xff1a;让你的网页内容一键变身专业PDF 【免费下载链接】wkhtmltopdf 项目地址: https://gitcode.com/gh_mirrors/wkh/wkhtmltopdf 还在为网页内容无法完美保存而烦恼&#xff1f;每次想要保存重要文章时&#xff0c;格式错乱、图片丢失、排版变形的问…

作者头像 李华
网站建设 2026/5/22 18:22:24

如何通过Python SDK在Collection中进行相似性检索

前提条件已创建Cluster已获得API-KEY已安装最新版SDK接口定义Python示例&#xff1a;Collection.query_group_by(self,vector: Optional[Union[List[Union[int, float]], np.ndarray]] None,*,group_by_field: str,group_count: int 10,group_topk: int 10,id: Optional[str…

作者头像 李华
网站建设 2026/5/23 13:25:17

AgentFounder浅析——Agent的演化历程与目标

Agent的目标以及对应的技术方案Agent的推理目标形式化的表达:咱们首先来分析一下最开始大模型的功能&#xff0c;即仅根据π的内部知识和问题q采样出答案oo∼π(⋅|q)然而&#xff0c;模型π原有的内部知识可能不足以支撑回答q问题&#xff08;没有训练过相关领域的数据&#x…

作者头像 李华