插槽(匿名插槽,具名插槽,作用域插槽)
1.匿名插槽
1.在组件中预留空间(slot),在父组件中引用子组件时可以向空间中填充内容,这个空间就称之为插槽
//只需要一个插槽的时候 定义子组件时需要预留插槽
Vue.component('子组件名',{
template:`
<div>
<slot>预留的插槽</slot>
</div>
`
})
//引用子组件时需要填充插槽
<子组件>需要填充的内容</子组件>
2.具名插槽
有多个插槽,(区别哪些内容填充到哪个位置),具名插槽
自定义组件时需要预留具有名字的插槽;
Vue.component("子组件名", {
template: `
<div>
<slot name="a">预留的插槽</slot>
<slot name="b">预留的插槽</slot>
<slot name="c">预留的插槽</slot>
</div>
`
})
引用子组件时需要指定填充哪个插槽:
<子组件名>
<template slot="插槽名">
需要填充的内容
</template>
<template slot="b">
需要填充的内容
</template>
<template slot="c">
需要填充的内容
</template>
</子组件名>
3.作用域插槽
- 父组件对子组件加工处理
- 既可以复用子组件的slot,又可以使slot内容不一致
<div id="app">
<!--
1、当我们希望li 的样式由外部使用组件的地方定义,因为可能有多种地方要使用该组件,
但样式希望不一样 这个时候我们需要使用作用域插槽
-->
<fruit-list :list='list'>
<!-- 2、 父组件中使用了<template>元素,而且包含scope="slotProps",
slotProps在这里只是临时变量
--->
<template slot-scope='slotProps'>
<strong v-if='slotProps.info.id==3' class="current">
{{slotProps.info.name}}
</strong>
<span v-else>{{slotProps.info.name}}</span>
</template>
</fruit-list>
</div>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
/*
作用域插槽
*/
Vue.component('fruit-list', {
props: ['list'],
template: `
<div>
<li :key='item.id' v-for='item in list'>
### 3、 在子组件模板中,<slot>元素上有一个类似props传递数据给组件的写法msg="xxx",
### 插槽可以提供一个默认内容,如果如果父组件没有为这个插槽提供了内容,会显示默认的内容。
如果父组件为这个插槽提供了内容,则默认的内容会被替换掉
<slot :info='item'>{{item.name}}</slot>
</li>
</div>
`
});
var vm = new Vue({
el: '#app',
data: {
list: [{
id: 1,
name: 'apple'
},{
id: 2,
name: 'orange'
},{
id: 3,
name: 'banana'
}]
}
});
</script>
</body>
</html>