Vue实现了一套内容分发的API,将 <slot>
元素作为承载分发内容的出口。
匿名插槽
一个不带name的
示例:
组件模板如下<a v-bind:href="url" class="nav-link">
<slot></slot>
</a>
在父组件中使用如下<nav-link url="/profile">
Your Profile
</nav-link>
当组件渲染的时候
如果组件模板的template中没有包含
具名插槽
<div class="container">
<header>
<slot name="header">``</slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer">``</slot>
</footer>
</div>
在父组件中使用<base-layout>
<template v-slot:header>
<h1>Here might be a page title</h1>
</template>
<p>A paragraph for the main content.</p>
<p>And another one.</p>
<template v-slot:footer>
<p>Here's some contact info</p>
</template>
</base-layout>
元素中的内容都会被传入到相应插槽,任何没有被包裹在带有 当使用组件的父组件不提供内容时,后备内容会被渲染 在父组件中使用user.age并不能访问到 规则:父级模板里的所有内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。 作用域插槽可以解决父组件无法访问到子组件数据的问题v-slot
的 <template>
中的内容都会被视为默认插槽的内容
后备内容
<a v-bind:href="url">
<slot>我是后备内容</slot>
</a>
在父组件模板使用如下<nav-link></nav-link>
这种情况下后备内容就会被渲染
或如下<nav-link>
Your Profile
</nav-link>
这种情况后备内容就不会被渲染,取而代之的是”Your Profile”被渲染编译作用域
<span>
<slot>{{user.name}}</slot>
在父组件中使用如下<current-user>
{{user.age}}
</current-user>
<current-user>
组件内部的user.age
**
作用域插槽
绑定在 <slot>
元素上的 attribute 被称为插槽 prop<span>
<slot ``v-bind:dataForParent="user"``>
{{user.name}}
</slot>
在父组件中使用如下<current-user>
<template ``v-slot:default="slotProps"``>
{{``slotProps.dataForParent.age``}}
</template>
</current-user>
“slotProps“可以用任意字符串替代