Vue2插槽的使用

文章目录

    • 插槽内容
    • 编译作用域
    • 后备(默认的)内容
    • 具名插槽
      • 具名插槽的缩写
    • 作用域插槽
      • 独占默认插槽的缩写语法
      • 解构插槽 Prop
    • 动态插槽名
    • 其他示例
    • 废弃的插槽语法
      • 带有slot attribute的具名插槽
      • 带有slot-scope attribute的作用域插槽

推荐先阅读一下 组件基础篇

v-slot指令:具名插槽和作用域插槽引入一个新的统一的语法。它取代了slot和slot-scope,目前这两个已被废弃但未被移除且仍在文档中的attribute。

插槽内容

Vue实现了一套内容分发的API,将 元素作为承载分发内容的出口,所以我们可以这样合成组件:

<navigation-link url="/API">
	// 一顿操作...
</navigation-link>

然后再 的模板中可能写成:

<a
	:href="url"
	class="nav-link"
>
	<slot></slot>    
</a>

当组件在渲染的时候,就会将 替换成 ‘一顿操作…’ 。插槽内可以包含任意模板代码,包括HTML:

<navigation-link url="/API">
    // 添加一个 Font Awesome 图标
    <span class="fa fa-user"></span>
	// 一顿操作...
</navigation-link>

甚至是它的组件:

<navigation-link url="/API">
	// 添加一个图标组件
    <font-awesome-icon name="user"></font-awesome-icon>
	// 一顿操作...
</navigation-link>

如果的 template 中没有包含一个 元素,则该组件起始标签和结束标签之间没有任何内容都会被抛弃。

编译作用域

当我们想要在插槽中使用数据时,例如:

<navigation-link url="/API">
	Lo in as {{ user.name }}    
</navigation-link>

该插槽跟模板的其他地方一样都可以访问相同的实例property(也就是相同的“作用域”),而不能访问的作用域。例如url是访问不到的:

<navigation-link url="/API">
    this is a {{ url }}
	// 这样写 url 会是 undefined ,因为其(只该插槽的)内容是传递给 ,而不是在  组件 内部 定义的
</navigation-link>

规则:父级模板里所有的内容都是在父级作用域中编译的;子模板里的所有内容都是在子作用域中编译的。

后备(默认的)内容

有时需要给插槽设置具体的后备(也就是 默认的)内容,是很有用的,它只会在没有提供内容的时候被渲染,例如组件中:

<button type="submit">
	<slot></slot>    
</button>

我们可能希望这个

但是只要我们提供了内容,后备内容将不会被渲染出来,而是渲染我们提供的内容:

<submit-button>
	Save    
</submit-button>

具名插槽

有时我们需要多个插槽时,例如对于一个带有如下模板的组件:

<div class="container">
    <header>
    	// 页头,随你操作...
    </header>
	<main>
    	// 页面主要内容,随你操作...
    </main>
	<footer>
    	// 页脚
    </footer>
</div>

对于这种情况, 元素有一个特殊的 attribute: name 。这个 attribute 可以用来定义额外的插槽:

<div class="container">
	<header>
    	<slot name="header"></slot>
    </header>
	<main></main>
	<footer>
    	<slot name="footer"></slot>        
    </footer>
</div>

一个不带name的出口会带有隐含的名字

在向具名插槽提供内容时,我们可以在一个