用法:
父组件App.vue
<template>
<div>
<!--将html代码插入到子组件中带默认名称的插槽中-->
<AChild>
<!--这段html会插入到AChild组件中<slot></slot>插槽中-->
<!-- 注意:写在父组件中的html代码只能在父组件中被访问到,所以这段html只能在父组件中被访问:如在App.vue中获取这段html。document.getElementById("mydiv") -->
<div id="mydiv">我是在App.vue组件中的一段HTML1</div>
</AChild>
<!--将html代码插入到子组件中带具体名称的插槽中-->
<AChild>
<template v-slot="aaa"> <!--v-slot可以简写成# 如: <template #"aaa"></template> -->
<div>我是在App.vue组件中的一段HTML1</div><!--这段html会插入到AChild组件中<slot name="aaa"></slot>插槽中-->
</template>
</AChild>
<!-- 作用域插槽 -->
<!--作用域插槽其实就是子组件提供了数据,具体数据怎么使用与渲染,由父组件来决定-->
<AChild>
<template v-slot:bbb="myprops"> <!--v-slot:bbb="myprops"的意思就是:在AChild子组件中定义了一个名称为bbb的插槽,这个插槽向外提供了数据,这个数据由myprops来接收。如果这个插槽没有名称就直接写成v-slot="myprops" -->
<button @click="handelClick(myprops)">点我</button>
<ul>
<li v-for="item in myprops.mylist" :key="item">{{item}}----这是由父组件重新渲染并覆盖了子组件中名字为bbb插槽中的内容</li>
</ul>
<div>{{myprops.mydata}}</div>
</template>
</AChild>
</div>
</template>
<script>
import AChild from "./components/AChild.vue" //导入AChild组件模板
export default {
components: {
AChild
},
methods:{
handelClick(myprops){
console.log(myprops)
console.log(myprops.mylist) //输出:["中国", "美国", "俄罗斯"]
console.log(myprops.mydata) //输出:"123"
}
}
}
</script>
子组件AChild.vue
<template>
<div>
<span>我的子组件内容1</span>
<!-- 默认插槽 -->
<slot></slot>
<!-- 具名插槽,即带有名称的插槽 -->
<slot name="aaa"></slot>
<!-- 作用域插槽 -->
<!--向父组件暴露了两个数据,一个是mylist,另外一个是mydata,父组件收到这两个数据后可以根据实际情况来重写这个slot中的内容-->
<slot name="bbb" :mylist="datalist" mydata="123">
<ul>
<li v-for="item in datalist" :key="item">{{ item }}</li>
</ul>
</slot>
</div>
</template>
<script>
export default {
data() {
return {
datalist: ["中国", "美国", "俄罗斯"]
}
}
}
</script>