平常我们封装组件后使用都是自闭合的形式,全靠数据+v-for+show+if来进行内部渲染

现在封装一个组件,并让他具有接收父组件传入DOM的功能进行渲染

1.简单的使用

// 封装组件:Packagin.vue
<div>
	<span>封装的组件</span>
	<slot/>
</div>

// 父组件使用它
<div>
	<Packagin>
		<input/>	//传入的DOM
	</Packagin>
</div>

2.让插槽在没有DOM显示的时候有默认值

// 封装组件:Packagin.vue
<div>
	<span>封装的组件</span>
	<slot>
		<span>默认值</span>
	</slot>
</div>

3.当传入多个DOM,我们想按照想要的顺序对DOM进行摆放,就需要用到具名插槽

// 封装组件:Packagin.vue
<div>
	<span>封装的组件</span>
	<slot name="herder">头部</slot>
	<slot name="main">中间</slot>
	<slot name="bottom">底部</slot>
	
	<slot>默认位置</slot>
	//等于name="default" 当外来DOM没指定具名插槽时,都会放默认插槽
</div>

// 父组件使用它
<div>
	<Packagin>
		<templete v-solt:header>
			<div>头部传入DOM</div>
		</templete>
		<templete #main>	//v-solt简写形式#
			<div>头部传入DOM</div>
		</templete>
		<templete #bottom>
			<div>头部传入DOM</div>
		</templete>
	</Packagin>
</div>

4.接收插槽子组件的返回数据

// 封装组件:Packagin.vue
<div>
	<slot :msg="item.msg" :age='item.age' :id='item.id' />
</div>

<script setup>
	defineProps(['item'])
</script>

// 父组件使用它
<div>
	<Packagin v-for="item of data" :key=item.id  :item=item>
		<template #default='slotProps' onClick={delete(slotProps.id)}>
        
		//只需要其中少量数据时,别忘记解构语法  #default='{id,age}'
			{{slotProps}}	
		//显示:{msg:'数据' , age:'数据'}
		
		</template>
	</Packagin>
</div>

<script setup>
	const data = [
		{msg:'嘿嘿',age:10,id:1},
		{msg:'哈哈',age:16,id:2},
	]
</script>