Slot
什么是 slot
插槽可以用来动态渲染组件内部的dom结构,<slot>
占位的内容由父元素来决定。
默认插槽
<!-- define -->
<button type="submit">
<slot></slot>
</button>
<!-- use -->
<SubmitButton>Save</SubmitButton>
具名插槽
<!-- define -->
<div class="container">
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
<!-- use -->
<BaseLayout>
<template #header>
<h1>Here might be a page title</h1>
</template>
<!-- 隐式的默认插槽 -->
<p>A paragraph for the main content.</p>
<p>And another one.</p>
<template #footer>
<p>Here's some contact info</p>
</template>
</BaseLayout>
作用域插槽
<!-- <MyComponent> 的模板 -->
<div>
<slot :text="greetingMessage" :count="1"></slot>
</div>
<!-- 通过子组件标签上的 v-slot 指令,接收到了一个插槽 props 对象 -->
<MyComponent v-slot="slotProps">
{{ slotProps.text }} {{ slotProps.count }}
</MyComponent>
<MyComponent v-slot="{ text, count }">
{{ text }} {{ count }}
</MyComponent>
<!-- 具名作用域插槽 -->
<slot name="header" message="hello"></slot>
<!-- use -->
<MyComponent>
<template #header="headerProps">
{{ headerProps }}
</template>
<template #default="defaultProps">
{{ defaultProps }}
</template>
<template #footer="footerProps">
{{ footerProps }}
</template>
</MyComponent>
如果你同时使用了具名插槽与默认插槽,则需要为默认插槽使用显式的
<template>
标签。尝试直接为组件添加 v-slot 指令将导致编译错误