Vue演练场基础知识(七)插槽

为学习Vue基础知识,我动手操作通关了Vue演练场,该演练场教程的目标是快速体验使用 Vue 是什么感受,设置偏好时我选的是选项式 + 单文件组件。以下是我结合深入指南写的总结笔记,希望对Vue初学者有所帮助。

文章目录

  • 十五. 插槽
    • 插槽内容与出口
    • 渲染作用域
    • 默认内容
    • 具名插槽
    • 条件插槽
    • 动态插槽名
    • 作用域插槽
    • 具名作用域插槽
    • 高级列表组件示例
    • 无渲染组件

十五. 插槽

插槽内容与出口

父组件可以用props向子组件传递js表达式,emits向子组件传递事件,那能不能直接向子组件传递定义好的模板内容呢?
这就是插槽的作用。


<div class="dialog">
	<slot />
div>
<Dialog>
	<div>对话框内容div>
Dialog>

最终渲染出的 DOM 是这样:

<div class="dialog">
	<div>对话框内容div>
div>

渲染作用域

由于插槽内容是在父组件里定义的,所以它能访问到父组件的数据作用域,不能访问子组件的。


<script>
export default {
	data() {
		return {msg: '来自子组件的内容'};
	}
}
script>
<template>
	<div class="dialog">
		<slot />
	div>
template>
<script>
import Dialog from './Dialog.vue';
export default {
	components: {Dialog},
	data() {
		return {msg: '来自父组件的内容'};
	}
}
script>
<template>
	<Dialog>
		<div>{{msg}}div>
	Dialog>
template>

最终渲染出的 DOM 是这样:

<div class="dialog">
	<div>来自父组件的内容div>
div>

默认内容

标签之间的内容可以作为默认内容,如果父组件使用了含有插槽的子组件但没有传入插槽内容,子组件中的插槽就使用默认内容。


<div class="dialog">
	<slot>默认内容slot>
div>
<Dialog>
	<div>对话框内容div>
Dialog>
<Dialog />

最终渲染出的 DOM 是这样:

<div class="dialog">
	<div>对话框内容div>
div>
<div class="dialog">
	默认内容
div>

具名插槽

有时候我们希望子组件能接收多个插槽内容,比如希望一个对话框组件支持分别接收头部内容、主体内容、底部内容。对于这种场景, 元素可以有一个特殊的 attribute name,用来给各个插槽分配唯一的 ID。
这类带 name 的插槽被称为具名插槽 (named slots)。没有提供 name 的 出口会被隐式地命名为“default”。


<div class="dialog">
	
	<header class="card-header">
	  <slot name="header" />
	header>
	
	<main class="card-main">
	  <slot>slot>
	main>
	
	<footer class="card-footer">
	  <slot name="footer">默认底部slot>
	footer>
div>

与之匹配的是包含模板内容的