Vue.js中通过Slots实现移动端Tab选项卡,核心是解耦TabBar与TabPane,利用具名slot、动态slot名+v-for、默认slot及keep-alive缓存提升灵活性与性能。

Vue.js 中通过 Slots 实现移动端 Tab 选项卡,核心在于解耦标签栏(TabBar)与内容区(TabPane),让父组件自由决定每个 tab 显示什么内容,无需在子组件里硬编码或用 v-if 切换 DOM。
用具名 Slot 区分不同 Tab 内容
Tab 组件接收多个具名 slot,比如 tab1、tab2、tab3,对应不同标签页的内容。父组件按需传入任意 Vue 模板片段——可以是纯文本、表单、列表,甚至嵌套子组件。
- 子组件中用
声明插槽位置 - 父组件中用
v-slot:tab1(或简写#tab1)注入内容 - 配合
v-model或emit控制当前激活 tab,实现点击切换时只显示对应 slot
动态 Slot 名 + v-for 实现可配置 Tab 列表
当 tab 数量不固定(如后台返回菜单配置),可用 v-for 渲染 tab 标题,并结合动态 slot 名绑定。关键点是 slot 名必须是字符串,且与循环项的 key 对齐。
- 父组件传入 tab 配置数组:
tabs = [{ key: 'home', title: '首页' }, { key: 'search', title: '搜索' }] - 子组件中用
声明 slot,注意使用作用域插槽语法(如果需要向 slot 传递数据) - 父组件中用
v-slot:[tab.key]动态绑定 slot 名,Vue 3 支持这种语法
默认 Slot 做兜底内容,提升灵活性
除了具名 slot,保留一个默认 可以作为未匹配 tab 的通用内容区域,或者用于展示加载状态、空状态等公共逻辑。
将静态 Vue 页面(index.vue)改造为动态页面(Custom.vue);稿源仅限 index.vue、其引用的 CSS 与资源路径,禁止参考仓库内其他文件。Invoke when user wants to transform a static Vue page into a dynamic data-driven page with Element UI components.
- 适合在 tab 切换过渡期显示 loading 图标
- 也可配合
v-show控制显隐,避免重复渲染 - 若所有具名 slot 都未提供,默认 slot 就自然生效,降低父组件使用门槛
配合 keep-alive 缓存内容,避免重复请求
移动端 Tab 切换频繁,每次切换都重新渲染会浪费资源。把每个 tab 内容包裹在 中,配合 include 或 name 属性精准缓存。
- 为每个具名 slot 内容组件设置唯一
name选项 - 在 Tab 组件模板中用
- 这样切换时 DOM 不销毁,组件实例保留在内存中,数据和滚动位置都可保留
Slots 让 Tab 组件真正变成“容器型”组件,内容完全由使用者定义,既轻量又强大。不需要 props 传一堆内容、也不用监听一堆事件,结构清晰,维护成本低。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










