有时你想要构建一个可以用来放置其他组件的组件。你可能想要建立一个通用的模式对话框组件,让你的用户编写对话框的文本。或者你想在一个组件中使用通用的布局,内容使用其他的元素进行填充。Slots就是这样一种方式:在一个组件中有个固定的结构,将组件中指定的部分的内容委托给其父组件。
How to do it
为了提高猫的士气,俄罗斯黑手党猫决定用一个web页面来展示本月最佳员工,并决定使用vue组件来完成此功能。
他们聘请你为主要的开发人员帮助他们编写如下的组件:
Vue.component('framed', {
template: `<div class="frame">
<h3>Russian cat mafia
employee of the month</h3>
<slot>Nothing framed.</slot>
</div>`
});
其中,slot标签标识占位符,在父类模板中,你将放置一些内容在里面。当然我们可以先给这个组件添加点样式:
.frame {
border: 5px dashed dodgerblue;
width: 300px;
}
h3 {
font-family: sans-serif;
text-align: center;
padding: 2px 0;
width: 100%;
}
HTML:
<div id="app">
<framed>
<cat :name="catName"></cat>
</framed>
</div>
请注意如何在frame组件中放置另外一个组件。其中cat组件如下所示:
Vue.component('cat', {
template: `<div>
<figure>
<img src="http://lorempixel.com/220/220/cats/"/>
<figcaption>{{name}}</figcaption>
</figure>
</div>`,
props: ['name']
});
每当有一个页面请求时,将随机加载一张宽为220px、高220px的猫的图像。
给figcaption添加样式:
h3, figcaption {
font-family: sans-serif;
text-align: center;
padding: 2px 0;
width: 100%;
}
Vue实例代码如下:
new Vue({
el: '#app',
data: {
names: ['Murzik', 'Pushok', 'Barsik', 'Vaska', 'Matroskin']
},
computed: {
catName () {
return this.names[Math.floor(Math.random() *
this.names.length)]
}
}
})
启动应用,你将会发现本月最佳员工:
本文翻译来自:Vue.js Codebook