当前位置: 首页 > news >正文

动态组件驱动的标签页架构(简单来说:一个页面包含许多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组件

http://www.rkmt.cn/news/86973.html

相关文章:

  • 企业IT运维实战:用万能网卡驱动批量部署500+办公电脑
  • 夜莺监控设计思考(一)整体定位、架构设计、单进程多进程选择、高可用设计
  • 自助项目全解析:适配老板画像业态选择指南
  • 2025年质量好的圆弧净化铝材高评价厂家推荐榜 - 品牌宣传支持者
  • 2025年靠谱的减震中空板/中空板行业内知名厂家排行榜 - 品牌宣传支持者
  • Stage应用模型及状态存储
  • springboot基于vue的共享电动车租赁系统设计与实现_6nk626x6
  • python3.14版本的free-threading功能体验
  • 传统vsAI:开发魔兽插件效率提升300%的秘密
  • 5分钟构建Java安全沙箱原型
  • Python MD5在实际项目中的5个典型应用场景
  • 5个关键步骤:轻松掌握Docker容器化部署的版本管理艺术
  • Apache Airflow数据治理自动化工具链终极指南
  • 3分钟完成OpenSSL安装:极速方案对比
  • 2025年评价高的伺服减速器/行星减速器厂家实力及用户口碑排行榜 - 行业平台推荐
  • 甲基化分析利器MethylDackel:3步掌握BS-seq数据处理核心技能
  • PictureSelector终极指南:Android图片选择库的完整使用教程
  • 包装设计创意大比拼,谁才是行业王者?
  • Python语言编程导论第三章 编写程序
  • 有序数组的平方——双指针
  • ssm 框架的校园二手交易市场系统
  • 如何通过5大核心升级打造专业级虚拟显示方案?
  • 电视盒子刷机终极方案:高安版设备完整避坑指南
  • 从按键到艺术:GSE宏编译器的用户体验进化之旅
  • Scrypted:打造智能家居视频监控的终极解决方案
  • 【2025 最新版】Audacity 下载安装教程(超详细图文步骤 + 新手快速上手指南) - PC修复电脑医生
  • 微信小程序图片裁剪实战:从入门到精通掌握we-cropper配置技巧
  • 小爱音箱音乐播放优化指南:三步完美解锁功能
  • 300B参数效率革命:ERNIE 4.5如何用异构MoE架构重塑企业AI格局
  • 人类知识已经喂不饱 GPT-5.2 了!下一代 AGI 靠“AI 凭空想象”出来的数据训练?一场模型自我进化的革命!