一直在ElementUI的table中使用插槽技术,但是并没有真正的理解到底什么是插槽?只知道这是父组建往子组建中派发内容;
关于slot是这样的,除非子组建模板中包含至少一个插口,否则父组建的内容将会被丢弃。当子组建模板只有一个没有属性的slot时,父组建整个内容片段将插入到slot所在的DOM位置,并替换掉slot标签本身。
最初在标签中的任何内容都被视为备用内容。备用内容在子组建的作用于内编译,并且只有在宿主元素为空,且没有要插入的内容的时候才显示备用内容;
单个Slot
在子组建内使用特殊的元素就可以为这个子组建添加一个slot(插槽),在父组建模板里,插入在子组建标签内的所有内容将替代子组建的标签及它的内容;
For example:
1 | // 父组建的内容 |
// 子组建的内容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 | <div id="app"> |
注意: 子组建内的备用内容,它的作用域是子组建本身;
具名slot
给元素制定一个name后可以分发多个内容,具名slot可以与单个slot共存,例如下面的示例:
1 | // 父组建的内容 |
1 | // 子组建的内容 |
子组建内声明了三个元素,其中在内的没有使用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: