useSlots
同样,通过 API 的命名也能了解它是用来获取插槽数据的。
但这个 API 对大部分同学来说应该用的比较少,因为大部分 Vue 开发者应该都是用的 SFC 模式(单组件),插槽可以直接在 template 里使用 <slot />
标签渲染。
所以,我个人觉得这个 API 的目标用户是面向 JSX / TSX 的开发者,简单的用法参考如下:
父组件,可以传入默认插槽和命名插槽:
<template> <!-- 子组件 --> <ChildTSX> <!-- 默认插槽 --> <p>I am a default slot from TSX.</p> <!-- 默认插槽 --> <!-- 命名插槽 --> <template #msg> <p>I am a msg slot from TSX.</p> </template> <!-- 命名插槽 --> </ChildTSX> <!-- 子组件 --> </template> <script setup lang="ts"> import ChildTSX from '@cp/context/Child.tsx' </script>
那么在 JSX / TSX 的子组件,通过 useSlots 来获取父组件传进来的 slots 数据进行渲染:
import { defineComponent, useSlots } from 'vue' const ChildTSX = defineComponent({ setup() { // 获取插槽数据 const slots = useSlots() // 渲染组件 return () => ( <div> // 渲染默认插槽 <p>{ slots.default ? slots.default() : '' }</p> // 渲染命名插槽 <p>{ slots.msg ? slots.msg() : '' }</p> </div> ) }, }) export default ChildTSX