组件插槽
在组件的使用时传入值通过
<slot></slot>
来传值
插槽的基本使用
1. 插槽位置
Vue.component('alert-box', {
template: `
<div class="demo-alert-box">
<strong>Error!</strong>
<slot></slot>
</div>
`
})
2. 插槽内容
<alert-box>Something bad happened.</alert-box>
具名插槽
有名字的插槽
slot的使用
//slot的使用
<body>
<div id="app">
<base-layout>
<p slot='header'>标题信息</p>
<p>主要内容1</p>
<p>主要内容2</p>
<p slot='footer'>底部信息信息</p>
</base-layout>
<base-layout>
<template slot='header'>
<p>标题信息1</p>
<p>标题信息2</p>
</template>
<p>主要内容1</p>
<p>主要内容2</p>
<template slot='footer'>
<p>底部信息信息1</p>
<p>底部信息信息2</p>
</template>
</base-layout>
</div>
<script type="text/javascript" src="js/vue.js"></script>
<script type="text/javascript">
/*
具名插槽
*/
Vue.component('base-layout', {
template: `
<div>
<header>
<slot name='header'></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name='footer'></slot>
</footer>
</div>
`
});
var vm = new Vue({
el: '#app',
data: {
}
});
</script>
</body>
注意:
- v-slot指令 是vue2.6.0之后添加的取代了
slot
和slot-scope
- slot和slot-scope是被废弃但未被移除的
- v-slot只能添加在
<template>
v-slot的使用
//v-slot的使用 必须引入vue2.6.0以后的js文件
<body>
<div id="app">
<slot-test>插槽的使用</slot-test>
<slot-teat>
<template v-slot:header>
<p>头部内容</p>
</template>
<p>主要内容1</p>
<p>主要内容2</p>
<template v-slot:footer>
<p>头部内容</p>
</template>
</slot-teat>
</div>
<script>
Vue.component('slot-test',{
template:`<div>
<slot></slot>
</div>`
});
Vue.component('slot-teat',{
template:` <div>
<header>
<slot name='header' ></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name='footer' ></slot>
</footer>
</div>`
});
let options={
el:'#app',
data:{
}
}
var vm=new Vue(options);
</script>
</body>
作用域插槽
父组件对子组件的内容进行加工处理
让插槽内容能够访问子组件中才有的数据是很有用的
slot-scope的使用
使用步骤
1.在字符串模板中为需要访问的插槽绑定一个v-bind:自定义属性=‘要访问的数据’
2.在标签中绑定指令v-slot或者slot-scope=‘自定义属性’
注意:
在使用v-slot指令时必须导入vue2.6.0之后的版本的js文件
<style type="text/css">
.current {
color: orange;
}
</style>
<script src="./js/vue-2.6.12.js"></script>
</head>
<body>
<div id="app">
<!-- 需求在视图上显示firstname的值在不改变组件的插槽内容 -->
<!-- 1.在字符串模板中为需要访问的插槽绑定一个v-bind:自定义属性='要访问的数据'
2.在<template>标签中绑定指令v-slot或者slot-scope='自定义属性' -->
<slot-test>
<!-- 第一种v-slot 导入的vue文件必须是vue2.6.0以后的 -->
<!-- <template v-slot="slotDate">
{{slotDate.user.firstname}}
</template> -->
<!-- 第二种 slot-scope -->
<template slot-scope="slotDate">
{{slotDate.user.firstname}}
</template>
</slot-test>
<!-- 需求遍历父组件中数据通过子组件动态渲染到页面上 -->
<slot-frusts :list="list">
<template v-slot="fruits">
<span :class='fruits.info.id==2?"current":""'>{{fruits.info.name}}</span>
</template>
</slot-frusts>
</div>
<script>
Vue.component('slot-test',{
data:function(){
return {
user:{
firstname:'冰冰',
lastname:'范'
}
}
},
template:`<div>
<slot :user='user'>{{user.lastname}}</slot>
</div>`
});
Vue.component('slot-frusts',{
props:['list'],
template:`
<div>
<ul>
<li :key='item.id' v-for="(item,index) in list">
<slot :info='item'>{{item.id}}</slot>
</li>
</ul>
</div>`
});
let options={
el:'#app',
data:{
list:[{
id:1,
name:'apple'
},{
id:2,
name:'orange'
},{
id:3,
name:'banana'
}]
}
}
var vm=new Vue(options);
</script>
</body>