天天看点

(十二)vue.js组件——进阶篇之slot插槽(4)

概述

我们已经知道,现在的web应用及其页面,基本都是由各个组件组合形成,那么这个时候我们【如何较好的组合各个组件】就成为了我们需要关心的问题了

场景

想象下,对于各个组件组合使用的场景,如果我们要在布局组件中包裹三个组件: 导航组件、内容组件、页脚组件

这时,我们该如何实现?

我们只能在定义布局组件时就引入这三个组件!

问题

如果这样实现的话,先不说可扩展性,就是万一哪天我们这三个组件的名字变了?或者不在引入这三个组件了,决定引入其他组件。

那这个布局组件岂不是就无法运行了?

slot救场

这时slot出现了,Slot便是为了更好的实现组件的组合而出现,特别是父子组件的内容。

Slot能够高扩展高复用的实现一个组件包裹另一个组件甚至是多个组件。

slot说明

下面我们来看看slot的详细的作用和用法:

① 一般而言,组件标签间的内容会被抛弃

正常情况下,我们在自定义组件标签中定义的任何内容,都会被抛弃。都只会渲染出组件模板内容。

(十二)vue.js组件——进阶篇之slot插槽(4)

② Slot可以把内容渲染进子组件

而如果我们使用slot就能实现让我们的内容渲染进行子组件中,达到如同使用网页标签一样使用我们的组件标签。

(十二)vue.js组件——进阶篇之slot插槽(4)

可以看到只是在子组件中加了一个slot就实现了,子组件中slot标签会自动的替换为父组件放入到子组件标签间的内容

③ 即便组件标签中放入其他组件也能渲染进去

(十二)vue.js组件——进阶篇之slot插槽(4)

④ slot中可以给默认值

(十二)vue.js组件——进阶篇之slot插槽(4)

⑤ Slot给我们带来的好处

1.让我们如同使用网页标签一样使用组件标签
2.当我们要让组件组合使用,比如混合父组件的内容与子组件的模板时,特别有用。
3.具体场景: 回忆下之前的场景
           

⑥ 具名slot (具有名字的插槽)

还是以我们之前的布局组件

<base-layout>

组件为例

这个组件中由header+main+footer三部分组成。

那么我们可以把头,体,尾这三部分别作为一个slot,等待组件调用者传入相应内容。

那么这时就可以使用具名插槽。(具有name属性的插槽)

完整代码如下

(十二)vue.js组件——进阶篇之slot插槽(4)

调用方式和运行结果

(十二)vue.js组件——进阶篇之slot插槽(4)

从上可知:

1.然后具名slot可以和 没有名字的默认slot 共存,父组件中没有绑定具名
slot的元素都将出现在子组件的默认slot中。【如果有多个无名的slot,
那就会渲染插入多次】
           
(十二)vue.js组件——进阶篇之slot插槽(4)
2.如果父组件中含义没有绑定具名slot的元素,但是子组件中却无匿名默
认slot时,父组件的那些原生将会被抛弃
           
(十二)vue.js组件——进阶篇之slot插槽(4)

⑦ 作用域插槽

场景

想象下,有这样一个场景:
现在你同事给了你一个列表组件,他内置了一个数组用于渲染列表。
这些都没问题,但是对于这个组件渲染的效果你并不满意。
然后你叫你同事修改渲染布局与样式,第一次,你同事很爽快的同意给你改了。
随着需求发生变化,你对渲染布局和样式又不满意了,第二次,你同事仍然爽快的
给你改了。
不久,需求又变了, 然后,第三次.....第n次.......
然后,你已经不好意思再去找同事修改了,这时该怎么办?
你可能在想,渲染那部分,你同事直接写成一个插槽slot,渲染效果作为默认值就行。
这样你可以根据需求随时自己写新的渲染布局进去。这样多好。
没错,想的非常好,可是你忽略了一个问题,那就是数据。。。。
这里面数据是内置的,而且这个数据是恒定而重要的,所以不需要外部参数。
 那么这时你该怎么办?这时你肯定想要是我写slot插槽时能够拿到同事组件中的内
 置数据该多好。
好吧,这时,你就可以使用作用域插槽了,什么是作用域插槽?
能够拿到子组件数据的插槽就叫做作用域插槽。完美的满足了你的需求。
           

默认组件渲染效果

(十二)vue.js组件——进阶篇之slot插槽(4)

作用域插槽实现

可由你决定效果的,具有作用域插槽的组件

(十二)vue.js组件——进阶篇之slot插槽(4)

解释:

作用域插槽的用法主要有两点

1.在子组件中写slot插槽时,给上属性(这些属性能够被父组件拿到)

2.在父组件中渲染内容时一般写template标签,并且标签上有个scope属性,这个属性的值为一个对象,就是子组件的slot插槽上所有属性的集合。

3.在父组件中就可以通过scope属性值这个对象操作子组件提供的数据。

(十二)vue.js组件——进阶篇之slot插槽(4)

然后提示下:作用域插槽也是可以具名的,即为一个拥有名字的slot.

(十二)vue.js组件——进阶篇之slot插槽(4)

⑧ 访问slot插槽

在vue2中,我们可以通过$slots访问当前组件中的所有slot插槽。

(十二)vue.js组件——进阶篇之slot插槽(4)

注意: 空文本元素也会作为获取的slot数组中的一个元素。

$slots在独立组件开发中比较有用。