1.解释
将父组件的内容插到子组件的对应位置,在子组件中使用slot,父组件使用子组件时,中间的内容部分会替换子组件slot所占位的部分
2.基本使用
<div id="app">
<login>
<h2>我是一个插槽</h2>
</login>
</div>
<template id="login">
<div>
<h1>一切情语皆景语</h1>
<slot></slot>
</div>
</template>
<script src="./js/vue.js"></script>
<script>
const login={
template:"#login",
data(){
return {
}
},
methods:{
}
}
const vm=new Vue({
el:"#app",
data:{
},
components:{
login
}
})
插槽的内容可以是一段文字,也可以是dom节点,除此之外还可以是一个组件
<div id="app">
<login>
<!-- 这里是插槽的位置,但是此时他是一个组件 -->
<txt></txt>
</login>
</div>
<template id="login">
<div>
<h1>一切情语皆景语</h1>
<slot></slot>
</div>
</template>
<template id="txt">
<div>
<p>我是一个txt组件</p>
</div>
</template>
<script src="./js/vue.js"></script>
<script>
const txt={
template:"#txt"
}
const login={
template:"#login",
}
const vm=new Vue({
el:"#app",
components:{
login,
txt
}
})
3.具名插槽
如果需要使用多个插槽,这是就需要用到具名插槽,slot的name与使用插槽slot时的属性值一致,这里的插槽可以使用data里的数据,这里可以将slot换成#
<div id="app">
<h1>这是一个父组件</h1>
<page >
<header slot="header">我是头部内容</header>
</page>
<section>
<page >
<section slot="body">我是主体内容{{book}}</section>
</page>
</section>
<!-- 使用插槽,slot后面的属性值与插槽名相对应 -->
<page >
<footer slot="footer">我是底部内容</footer>
</page>
</div>
<template id="page">
<div>
<!-- 这里用了三个插槽,分别对应三块内容,给插槽起对应的名字 -->
<slot name="header"></slot>
<slot name="body"></slot>
<slot name="footer"></slot>
</div>
</template>
<script src="./js/vue.js"></script>
<script>
const page={
template:"#page",
// data(){
// return{
// book:"wansgu"
// }
// }
}
const vm=new Vue({
el:"#app",
data:{
book:"围城"
},
components:{
page
}
})
4.子组件的数据在父组件插槽中使用
1.首先在组件的slot中需要动态绑定一个属性,将要传入到父组件的插槽位置的数据绑定上去
2.父组件中默认插槽的位置可以使用这个数据,需要在组件上定义一个v-slot=”slotProps”,在slotProps中可以获取到子组件传递过来的数据
<div id="app">
<login v-slot="slotProps">
<div>{{slotProps.user.lastName}}</div>
</login>
</div>
<template id="login">
<span>
<slot :user="user"></slot>
</span>
</template>
<script src="./js/vue.js"></script>
<script>
const login={
template:"#login",
data(){
return{
user:{
firstName:"wang",
lastName:"su"
}
}
}
}
const vm=new Vue({
el:"#app",
components:{
login
}
})