vue组件传值插槽

本文详细介绍了Vue组件的基础概念,包括组件的复用性、全局和局部组件的使用,父子组件间的通信方法(props和emit),以及插槽(slot)的原理、不同类型(匿名/具名/作用域插槽)和省略规则。
摘要由CSDN通过智能技术生成

vue组件

初识Vue组件

组件的本质是一个可复用的小号vue实例
根组件

vue实例(new Vue)是最大的跟组件

全局组件

Vue.component('组件名‘,配置对象) 全局组件可以用在不同实例中

局部组件

局部组件只能定义在组件中(实例中)

父子组件

组件间通信

子组件获取父组件数据

父组件:
<Child msg="父组件的数据"></Child>
子组件:

<script lang="ts">
export default defineComponent({
 props:{
	msg:{
		required:true, // 定义父组件是不是必须传递这个值
		type:String, //定义msg的值的类型,
		default:'默认值' //定义msg的默认值
	}
 }
})
</script>`

子组件通过props获取到父组件的值,props可以定义这个值的类型以及父组件是否必须传值

父组件获取子组件数据
子组件

<script lang='ts'>
export default defineComponent({
	setup(props,context){
	const state:any = reactive({
		msg:'子组件向父组件传值、父组件获取子组件数据'
	})
		const sendMsg = ()=>{
			context.emit('FaterSendMsg',state.msg)
		}
	}
})
</script>

父组件

<Child @FaterSendMsg = 'sendMsg'></Child>
// FaterSendMsg 是子组件中定义的方法
<script>
	const sendMsg = (val:any)=>{
	// val 是子组件传递过来的值
		console.log(val) //子组件向父组件传值、父组件获取子组件数据
	}
</script>

多级组件通信

provide 声明要传递的数据
inject 接收数据

slot插槽

父组件
<div>
	<Child>
		父组件传递给子组件的信息
		<button>按钮</button> // 带标签的内容
		<Child2></Child2> // 组件
	</Child>
</div>

子组件
<div class="child">
	<h2>子组件使用插槽</h2>
	<slot>子组件插槽内容</slot>
</div>

// 子组件使用插槽
// 父组件传递给子组件的信息

slot 与props的区别

通过props属性,父组件只能向子组件传递属性、方法
插槽还能传递带标签的内容,甚至组件

匿名插槽,具名插槽

匿名插槽
一个组件只能有一个匿名插槽
可以放在组件的任意位置
匿名插槽只能作为没有slot属性的元素的插槽

具名插槽
具有名字的插槽,名字通过属性name定义
<slot name="left">插槽内容</slot>
一个组件中可以有多个具名插槽,可以出现在不同位置

作用域插槽

子组件
<div class="child">
	<slot v-bind:childData="childUser"></slot>
</div>
<script>
export default{
	data(){
		return {
			childUser:{name:'Tom',age:'12'}
		}
	}
}
</script>

父组件
<div>
	<Child v-solt:default="slotProps"> // default 可省略
		{{slotProps.ChildData.name}}
		{{slotProps.ChildData.age}}
	</Child>
</div>

多个作用域

子组件
<div class="child">
	<slot v-bind:childData="childUser"></slot>
	<slot name="other" v-bind:otherChildData = "otherUser"></slot>
</div>
<script>
export default{
	data(){
		return {
			childUser:{name:'Tom',age:'12'},
			otherUser:{last:'啦啦啦'}
		}
	}
}
</script>

父组件
<div>
	<Child>
		<template v-slot:default="slotProps"> // 多个插槽的时候,default 不能省略
		{{slotProps.childData.name}}
		</template>
		<template v-bind:other="otherSlotProps"> // 具名插槽
		{{otherSlotProps.otherChildData.last}}
		</template>
	</Child>
</div>

插槽的省略

匿名插槽省略(组件中有多个插槽时,default不可省略)
<Child v-slot:default="slotProps"></Child>
可省略为 <Child v-slot="slotProps"><Child>
亦可省略为 <Child #default="{slotProps}"></Child>
具名插槽省略
<Child v-slot:other="slotProps"></Child>
<Child #other="{slotProps}"></Child>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值