vue插槽详解

作用:父组件向子组件传递内容,slot更像是一个出口

类型:默认插槽 具名插槽 作用域插槽

1.父组件向子组件传递内容

index.vue父组件如下::

	<children>
		<p>我是传递的内容</p>
   </children >

children.vue:子组件接收 如下:

	<template>
		<div>
			<h1>{{msg}}</h1>
		    <slot></slot>//这里是接收放置父组件传递的内容
		</div>
	</template>

子组件通过写入slot标签作为一个出口,接收父组件传递过来的内容

2.slot插槽可复用性

例如再children.vue页面可设置多个出口

	<template>
		<div>
			<h1>{{msg}}</h1>
		    <slot></slot>//这里是接收放置父组件传递的内容
		    <slot></slot>//这里是接收放置父组件传递的内容
		</div>
	</template>
3.组件定制化

index.vue如下:

	<template>
			<children>
				<p>我是传递的内容</p>//这里传递了内容,可在页面显示
		   </children >
		   <children/>//放置多个组件,这里没有传递内容
	</template>
4.默认插槽

当父组件传入值的时候优先展示父组件的内容,父组件传入为空时,展示子组件插槽的默认内容
children.vue如下:

<template>
	<div>
		<h1>{{msg}}</h1>
		<h3>
				<slot>我是子组件的默认内容</slot>
        </h3>
	</div>
</template>

index.vue如下:

index.vue
<template>
	<div>
		<h1>{{msg}}</h1>
		<children>我是父组件传入的内容</children >
	</div>
</template>
5.具名插槽

1.子组件slot设置唯一name<slot name='h_1'></slot>,
父组件传递内容通过template标签并且指定v-slot:h_1和子组件一致的name,即可显示再对应的插槽内
<template v-slot:h_1> <p>我是h1的内容</p> </template>
v-slot:标签可替换为#,例如<template v-slot:h_1>可替换为<template #h_1>
children.vue如下:

<template>
	<div>
		<h1>{{msg}}</h1>
		<h1><slot  name='h_1'></slot></h1>
		<h2><slot  name='h_2'></slot></h2>
		<h3><slot   name='h_3'></slot></h3>
	</div>
</template>

index.vue如下:

index.vue
<template>
	<div>
		<h1>{{msg}}</h1>
		<children>
			<template v-slot:h_1>
					<p>我是h1的内容</p>
			</template>
			<template v-slot:h_2>
					<p>我是h2的内容</p>
			</template>
			<template #h_3>
					<p>我是h3的内容</p>
			</template>
		</children >
	</div>
</template>
6.作用域插槽
6.1:从父组件拿到了子组件的内容,子组件传递内容给父组件

index.vue如下:
通过v-slot:default='strProps'接收子组件的内容

<template>
	<div>
		<h1>{{msg}}</h1>
		<children>
			<template v-slot:default='strProps'>
					{{strProps.str.job}}
			</template>
			<template v-slot:n_srt='strProps'>
					{{strProps.str.job}}
			</template>
		</children >
	</div>
</template>

children.vue如下:
通过v-bind定义一个字段名为str,后面为传递的内容strData,传给父组件 v-bind:str='strData'

<template>
	<div>
		<h1>{{msg}}</h1>
		<h1>
				<slot v-bind:str='strData'>{{strData.name}}</slot>
				<slot name='n_str' v-bind:str='strData'>{{strData.job}}</slot>
		</h1>
	</div>
</template>
<script>
	name:'index',
	data(){
		return{
			msg:'我是子组件',
			strData:{
					name:'我是子组件',
					job:'测试作用域插槽'
			}
		}
	}
</script>

完整代码如下所示:

index.vue
<template>
	<div>
		<h1>{{msg}}</h1>
		<children></children >
	</div>
</template>
<script>
	import  children from './children.vue'
	name:'index',
	data(){
		return{
			msg:'vue插槽slot---父组件'
		}
	}
</script>
children.vue
<template>
	<div>
		<h1>{{msg}}</h1>
	</div>
</template>
<script>
	name:'index',
	data(){
		return{
			msg:'我是子组件'
		}
	}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值