Slot插槽技术

一直在ElementUI的table中使用插槽技术,但是并没有真正的理解到底什么是插槽?只知道这是父组建往子组建中派发内容;

关于slot是这样的,除非子组建模板中包含至少一个插口,否则父组建的内容将会被丢弃。当子组建模板只有一个没有属性的slot时,父组建整个内容片段将插入到slot所在的DOM位置,并替换掉slot标签本身。

最初在标签中的任何内容都被视为备用内容。备用内容在子组建的作用于内编译,并且只有在宿主元素为空,且没有要插入的内容的时候才显示备用内容;

单个Slot

在子组建内使用特殊的元素就可以为这个子组建添加一个slot(插槽),在父组建模板里,插入在子组建标签内的所有内容将替代子组建的标签及它的内容;

For example:

1
2
3
4
5
6
7
// 父组建的内容
<div id="app">
<child-component>
<p>分发的内容</p>
<p>更多分发的内容</p>
</child-component>
</div>

// 子组建的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script>
Vue.component('child-component', {
template: '
<div>
<slot>
<p>如果父组建没有插入内容,我将作为默认出现</p>
</slot>
</div>'
})

var app = new Vue({
el: '#app'
});
</script>

子组建在child-component的模版内定义一个元素,并且用一个作为默认的内容,在父组建中没有使用slot时,会渲染这段默认的文本;如果写了slot,那就会替换整个,所以上述代码的渲染结果如下:

1
2
3
4
5
6
<div id="app">
<div>
<p>分发的内容</p>
<p>更多分发的内容</p>
</div>
</div>

注意: 子组建内的备用内容,它的作用域是子组建本身;

具名slot

给元素制定一个name后可以分发多个内容,具名slot可以与单个slot共存,例如下面的示例:

1
2
3
4
5
6
7
8
9
// 父组建的内容
<div id="app">
<child-component>
<h2 slot="header">标题</h2>
<p>正文内容</p>
<p>更多正文内容</p>
<div slot="footer">底部内容</div>
</child-component>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 子组建的内容
Vue.component('child-component', {
template: '
<div class="component">
<div class="header">
<slot name="header"></slot>
</div>
<div class="main">
<slot></slot>
</div>
<div class="footer">
<slot name="footer"></slot>
</div>
</div>
'
})

var app = new Vue({
el: '#app'
})

子组建内声明了三个元素,其中在内的没有使用name特性,它将作为默认slot出现,父组建没有使用slot特性的元素与内容都将出现在这里。如果没有制定默认的匿名slot,父组建内多余视为内容片段都将被抛弃。

上述例子最终渲染结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div id="app">
<div class="component">
<div class="header">
<h2>标题</h2>
</div>
<div class="main">
<p>正文内容</p>
<p>更多的正文内容/p>
</div>
<div class="footer">
<div>底部信息</div>
</div>
</div>
</div>

在组合使用组建时,内容分发API至关重要;

More info:

坚持原创技术分享,您的支持将鼓励我继续创作!