vue 插槽详解

Avatar
admin

@TOC

在 Vue.js 中,插槽(Slots) 是一种极为强大且灵活的内容分发机制。它允许父组件向子组件“注入”模板片段,从而实现组件的高度可复用性和布局的动态定制。通过插槽,我们可以将组件的结构与内容解耦,让子组件专注于逻辑与布局,而将具体展示内容交由父组件决定。

这种“内容占位、外部填充”的思想,类似于 HTML 中的 元素在 Web Components 中的作用,是构建高级 UI 组件库(如 Element Plus、Ant Design Vue 等)的核心技术之一。

本文将系统讲解 Vue 插槽的各类用法,从基础默认插槽到具名插槽、作用域插槽,再到实际项目中的高级应用场景,并附有详细代码示例,帮助你全面掌握这一核心特性。

一、基础插槽

1. 默认插槽(Default Slot)

默认插槽是最简单的插槽形式,用于在子组件中预留一个内容插入点。当父组件使用该子组件时,其标签内的内容会自动“流入”子组件的 位置。

这非常适合用于封装通用容器型组件,比如卡片(Card)、面板(Panel)等,它们具有固定的外框结构,但内部内容由使用者决定。

说明: 标签内的内容为“后备内容”(fallback content),只有当父组件没有提供内容时才会显示。如果父组件传入了内容,则后备内容会被替换。

效果:渲染后,

标签的内容将出现在子组件的 位置,取代“这是默认内容”。

2. 插槽作用域

理解插槽的作用域是掌握插槽机制的关键。Vue 的规则如下:

父组件模板中的所有内容都在父组件的作用域中编译。

子组件模板中的内容在子组件作用域中编译。

这意味着:插槽内的模板虽然渲染在子组件中,但它只能访问父组件的数据,不能直接访问子组件的数据。

例如,以下写法是错误的:

{

{ childData }}

要实现子组件向插槽传递数据,必须使用 作用域插槽(Scoped Slot),我们将在第三部分详细介绍。

二、具名插槽(Named Slots)

当一个子组件需要多个内容插入点时,仅靠默认插槽就无法满足需求。这时可以使用 具名插槽,通过 name 属性为不同插槽命名,实现多区域内容分发。

1. 子组件定义具名插槽

我们可以设计一个通用布局组件,包含页眉、主内容区和页脚三个区域,每个区域都通过具名插槽暴露出去。

说明:

name="default" 的插槽可以省略 name 属性,称为“默认插槽”。

所有未命名的内容都会被分配到默认插槽。

2. 父组件分发内容

父组件使用 v-slot 指令来指定内容应插入哪个具名插槽。

注意:所有具名插槽的内容必须包裹在