关于vue中的组件渲染函数render中的scopedSlots属性和this.$scopedSlots和this.$slots的疑惑记录

最近研究了vue的官方文档,到组件自定义渲染函数时,对第二个属性对象参数中的scopedSlots不太明白作用是什么,官网的案例也是一笔带过,于是连查带试算是明白了他的作用,这里记录一下,希望能帮到遇到相同问题的童鞋.

先说一下函数中的$slots吧,这个用起来很简单,直接获取到组件中对应的插槽虚拟节点.this.$slots.插槽名称.

废话少说,直接上代码:

<div id="app">
	<cus-node>
		<template v-slot:content>
			Hello everyone, I'm content slot!
		</template>
	</cus-node>
</div>
<script type="text/javascript">
	Vue.component ("cus-node", {
		render: function (createElement) {
			return createElement ("div", [
				createElement ("h1", "the title"),
                                //这里直接把上面template中的内容搞到p标签里面
				createElement ("p", this.$slots.content)
			]);
		}
	});

	var vm = new Vue ({
		el: "#app"
	});
</script>

效果如下:

下面来看一下this.$scopedSlots的用法和作用, 个人认为,他的作用是向插槽内传递参数,代码如下:

	<div id="app">
		<cus-node>
			<template v-slot:title="datas">
				<div>
					new title: today is a special day <br />
					old title: {{datas.name}}
				</div>
			</template>
			<template v-slot:content>
				he content slot
			</template>
		</cus-node>
	</div>
	<script type="text/javascript">
		Vue.component ("cus-node", {
			render: function (createElement) {
				//切记, 插槽如上面的写法: v-slot:title="datas"酱紫是无法使用this.$slots获取的!!!
				console.log (this.$slots.title);//undefined
				return createElement ("div", [
					//把title插槽内容放在h1标签中,并向title插槽传递一个参数name
					createElement ("h1", this.$scopedSlots.title ({
						name: this.name
					})),
					//把content插槽植入新创建的p之中
					createElement ("p", this.$slots.content)
				]);
			},
			data: function () {
				return {
					name: "component data title"
				}
			}
		});

		var vm = new Vue ({
			el: "#app"
		});
	</script>

this.$scopedSlots同样是获取到插槽内容,比this.$slots厉害的一点是他可以向插槽中传递参数,只需要在调用的时候传递一个参数对象就好了.值得注意的是,父组件插入插槽标签的时候,如果使用属性v-slot:name="datas"的方式获取参数时,this.$slots是获取不到内容的,打印为undefined.

接下来,看一下大Boss:scopedSlots属性.

上面两个都是获取到父组件中创建的插槽,而scopedSlots属性是创建一个插槽,当在渲染函数中创建自定义组件时,可以使用这个属性创建一个插槽进去.直接上代码吧:

<!DOCTYPE html>
<html>
<head>
	<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
	<title>vue pro</title>
	<style type="text/css">
	</style>
</head>
<body>
	<div id="app">
		<cus-node2>origin cus-node2</cus-node2>
	</div>
	<script type="text/javascript">
		//定义组件cus-node1
		Vue.component ("cus-node1", {
			//向default插槽传递一个text参数,当没有default插槽时,展示cus-node1 default slot
			template: "<div>this is cus-node1<slot :text='text'>cus-node1 default slot</slot></div>",
			data: function () {
				return {
					text: "I'm cus-node1.text"
				}
			}
		});
		//定义组件cus-node2
		Vue.component ("cus-node2", {
			render: function (createElement) {
				//创建一个cus-node1标签
				return createElement ("cus-node1", {
					scopedSlots: {
						//创建一个default插槽插入cus-node1中
						default: function (props) {
							//此处props为cus-node1组件向default插槽传递的参数
							//插槽内容是一个span标签,如果cus-node1有对插槽传递text参数时,就展示出来;否则展示props.text is null
							return createElement ("span", props.text || "props.text is null");
						}
					}
				});
			}
		});

		var vm = new Vue ({
			el: "#app"
		});
	</script>
</body>
</html>

注释很详细了,效果如下:

可以看到span标签就是创建出的插槽.贼6!

好了,希望能帮助大家,有错误的地方欢迎大家指正.转载请表明出处,蟹蟹

  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值