Vue3 如何渲染嵌套的插槽

1,896 阅读1分钟

嵌套的插槽是什么意思?

  • 如下图代码所示:
    先是渲染了一个 Tabs 组件,黄色框里面是他的插槽内容,里面又有一个 Tab 组件,里面浅蓝色框里又是 Tab 组件的插槽内容。 image.png
  • 所以我们需要写两个 slot 才能渲染这个内容

先写第一个插槽

  • 来到 Tabs 组件
  • 如果直接写 <slot />就没办法一个一个地获取子组件,会把所有内容直接显示出来,所以不能用。
  • 以下代码,可以达到效果(用 component实现的插槽): image.png
  • 改写成 v-forimage.png

写第二个插槽

  • 来到 Tab 组件
  • 直接用<slot />,因为他不需要检查 slot 内容,将所有内容显示出来即可:

image.png

  • 成功渲染了内容,但是 title 还没有渲染(本该渲染在“内容1”和“内容2”顶部)

image.png

image.png

显示 title

  • 先在 Tabs 里获取到这个 title
  • 通过 console.log 找到 title 在 tag.props.title 上 (这里 tag 前面的 ...是扩展操作符,意思是把 tag 展开打印出来) image.png

image.png

  • 把 title 存起来,用map不用forEach,记得在 return 把 titles 导出

image.png

  • 在页面显示 要注意,只要用到了v-for就必须要写:key="x",而且 key 要有唯一性,重复了会报错,所以这里把index传进去,用:key="index",但是这样也会有 bug,这个以后再说。

image.png

成功显示 title

image.png