需求

点击Tab,切换内容
有一横线在动

创建 Tabs 组件和 Tab 组件

  1. <Tabs>
  2. <Tab title="导航1">内容1</Tab>
  3. <Tab title="导航2"><Component1/></Tab>
  4. <Tab title="导航3"><Component1 x="hi"/></Tab>
  5. </Tabs>

如何在运行时确认子组件的类型(防止使用者用了Tab以外的标签)

检查 context.slots.default() 数组
image.png

  1. //展示组件
  2. <component :is="defaults[0]"/>
  3. <component :is="defaults[1]"/>
  4. // 找到以上标签的类型
  5. setup(props, context) {
  6. const defaults = context.slots.default();
  7. return {defaults}
  8. }
  9. // 检查标签是否为Tab
  10. defaults.forEach((tag) => {
  11. if (defaults[0].type !== Tab) {
  12. throw new Error('Tab 的子标签必须是 Tab');}}

如何渲染嵌套的组件

嵌套插槽
使用
替换

  1. v-for="(t,index) in titles" :key="index">{{t}}
  2. v-for="(c,index) in defaults" :is="c" :key="index"

image.png
image.png
image.png

切换标签页

用 selected 标记被选中的标签页
selected 用 index 表示,不推荐
selected 用 name 表示,不方便
selected 用 title 表示,有漏洞
image.png
image.png

制作会动的横线