什么是插槽
子组件提供给父组件的占位符,用 slot 元素来表示,
父组件可以在这个占位符里面填充各种模板代码。
1. 匿名插槽:
父组件引入子组件,在子组件内留 标签,
就可以在父组件中的子组件标签中写入内容。
例:
父组件:
<template>
<div>
<h1>父组件</h1>
<!-- 子组件标签 -->
<Comp>
<p>匿名插槽</p>
</Comp>
</div>
</template>
<script>
import Comp from "./子组件.vue"
export default {
components:{
Comp,
},
data(){
return {};
},
}
</script>
<style lang="less" scoped>
</style>
子组件:
<template>
<div>
<p>子组件</p>
<-- slot 占位符 -->
<slot></slot>
</div>
</template>
<script>
export default {
}
</script>
<style lang="less" scoped>
</style>
2. 具名插槽:
子组件内的 标签添加 name 属性,
父组件写入内容时,在子组件标签内用 v-slot:插槽名称 属性,便可将数据放在指定位置 ( 简写 #插槽名称 )
例:
父组件:
<template>
<div>
<h1>父组件</h1>
<!-- 子组件标签 -->
<Comp>
<p>匿名插槽</p>
<template v-slot:top>
<div >具名插槽-top</div>
</template>
<template #footer>
<div >具名插槽-footer</div>
</template>
</Comp>
</div>
</template>
<script>
import Comp from "./子组件.vue"
export default {
data(){
return {};
},
components:{
Comp,
},
}
</script>
<style lang="less" scoped></style>
子组件:
<template>
<div>
<p>子组件</p>
<slot name="top"> 具名插槽 </slot>
<slot></slot>
<slot name="footer"> 具名插槽 </slot>
</div>
</template>
<script>
export default {
}
</script>
<style lang="less" scoped></style>
3. 作用域插槽:
能传递数据,父组件可以接收子组件传递的数据
格式:v-slot : 插槽名称 = “ props ”
例:
父组件:
<template>
<div>
<h1>父组件</h1>
<Comp>
<p>匿名插槽</p>
<!-- 子组件传递的值存入自定义变量 -->
<template v-slot:top="props">
<div>
<p>具名插槽-top</p>
</div>
<!-- 通过自定义变量引出子组件传入数据 -->
<p>tex1: {{ props.text1 }}</p>
</template>
<template #footer="NewProps">
<div>具名插槽-footer</div>
<p>tex2: {{ NewProps.text2 }}</p>
</template>
</Comp>
</div>
</template>
<script>
import Comp from "./子组件.vue";
export default {
data() {
return {};
},
components: {
Comp,
},
};
</script>
<style lang="less" scoped></style>
子组件:
<template>
<div>
<p>子组件</p>
<!-- 单向绑定数据传值 -->
<slot name="top" :text1="1"></slot>
<slot></slot>
<slot name="footer" :text2="2"></slot>
</div>
</template>
<script>
export default {
data() {
let arr = 3;
},
};
</script>
<style lang="less" scoped></style>
注意:
1. vue3 只能用 v-slot
2. v-slot 是从 2.6.0+ 开始使用在此之前的格式为:
<template slot="top" slot-scope="props">
<div>
<p>具名插槽-top</p>
</div>
<!-- 通过自定义变量引出子组件传入数据 -->
<p>tex1: {{ props.text1 }}</p>
</template>
4. 动态插槽:
格式: v-slot : [ 变量插槽名 ]
简写: #[ 变量插槽名 ]
例:
父组件:
<template>
<div>
<h1>父组件</h1>
<Comp>
<p>匿名插槽</p>
<!-- 动态插槽名 -->
<template v-slot:[name]="props">
<div>
<p>具名插槽-top</p>
</div>
<!-- 通过自定义变量引出子组件传入数据 -->
<p>tex1: {{ props.text1 }}</p>
</template>
<template #footer="NewProps">
<div>具名插槽-footer</div>
<p>tex2: {{ NewProps.text2 }}</p>
</template>
</Comp>
</div>
</template>
<script>
import Comp from "./子组件.vue";
export default {
data() {
return {
name:"top" // 定义一个变量
};
},
components: {
Comp,
},
};
</script>
<style lang="less" scoped></style>