1.什么是插槽
在 Vue.js 中咱们使用 slot 元素做为承载分发内容的出口,作者称其为 插槽,能够应用在组合组件的场景中
2.怎么使用插槽
<div id="vue" >
<p>学习路线</p>
<ul>
<li>java</li>
<li>spring框架</li>
<li>linux</li>
</ul>
</div>
需求
- 写一些待办事项表,现在上面页面中的数据都是在前端写死的,是静态的,而真实业务中这些数据都应该是从数据库中查询出来的(每个人的数据应该是不一样的),分析上面的数据,需要动态变化的数据就是title和li中的数据,需求看到这里是不是觉得我们在data中定义两个参数,一个title,一个集合(由li遍历输出)就可以满足需求了?
- 但是上面这么实现是不是前端的代码就被写死了?就是这里我不想放一个列表了,我想放一张图片,或者放一个链接,那么是不是还要去修改视图中的代码?
- 这个时候就显示出插槽的作用了,定义一个插槽,随便你往里面插入什么数据
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="vue" >
<todo>
<todo-items slot="items" v-for="item in todoItems" :item="item"></todo-items>
<todo-title slot="title" :title="title"></todo-title>
</todo>
</div>
<!--引入 JS 文件-->
<script src="../../../vue.js"></script>
<script type="text/javascript">
Vue.component("todo",{
template:"<div>\
<slot name='title'></slot>\
<ul>\
<slot name='items'></slot>\
</ul>\
</div>"
})
Vue.component("todo-title",{
props: ["title"],
template: "<div>{{title}}</div>"
})
Vue.component("todo-items",{
props: ["item"],
template:"<li>{{item}}</li>"
})
var vm = new Vue({
el: '#vue',
data:{
title:"Java学习路线",
todoItems:["java基础","Java框架","Vue"]
}
});
</script>
</body>
</html>
- 测试
- 尝试将原来的title部分改成一个超链接
- 如果使用原来直接在上面写上一个{{title}}的方式要实现不修改视图代码而实现相同的功能是不可能的,这就是插槽强大的地方
小结
- 所谓插槽就是在一个Vue组件中为一个留了一个口子,我们可以在这个口子里面任意的插入我们想要的插入的东西
- 这样做使得在不修改视图的情况下,原视图具有很好的扩展性