vue2-slot是什么?

1、slot是什么?
在html中slot元素,作为web Compoents技术套件的一部分,是Web组件内的一个占位符,该占位符可以在后期使用自己的标记语言填充。
举例:vue2-slot是什么?_第1张图片
template不会展示到页面中,需要先获取它的引用,然后添加到DOM中。
vue2-slot是什么?_第2张图片
在vue中的概念也是如此。

Slot(插槽)花名:占坑,我们可以理解为slot在组件模板中占好了位置,当使用该组件标签的时候,组件标签里面的内容就会自动填坑(替换组件模板中slot位置),作为承载分发内容的出口,可以将其类比为插卡式的游戏机,游戏机暴露卡槽(插槽),让用户插入不同的游戏磁条(自定义内容)。

2、使用场景
通过插槽可以让用户可以拓展组件,去更好地复用组件和对其做定制化处理。
如果父组件在使用到一个复用组件的时候,获取这个组件在不同的地方有少量的修改,如果去重写组件是一个不明智地事情。
通过slot插槽向组件内部指定位置传递内容,完成这个复用组件在不同场景的应用。
比如:布局组件,表格列,下拉选框,弹框显示内容等。

3、分类
slot可以分为以下几种:
默认插槽
具名插槽
作用域插槽

默认插槽:子组件用标签来确定渲染的位置,标签里面可以放DOM结构,当父组件使用的时候没有往插槽里面传内容,标签内DOM结构就会显示在页面。
父组件在使用的时候,直接在子组件的标签内写入内容即可。
子组件Child.vue
vue2-slot是什么?_第3张图片
父组件:
vue2-slot是什么?_第4张图片

具名插槽:
子组件用name属性来表示插槽的名字,不传为默认插槽
父组件中在使用时在默认插槽的基础上加上slot属性,值为子组件插槽name属性值。
子组件Child.vue
vue2-slot是什么?_第5张图片
父组件
vue2-slot是什么?_第6张图片
作用域插槽:子组件在作用域上绑定属性来将子组件的信息传给父组件使用,这些属性会被挂在父组件v-slot接受的对象上。
父组件中在使用时通过v-slot:(简写:#)获取子组件的信息,在内容中使用。
子组件Child.vue
vue2-slot是什么?_第7张图片
父组件:
vue2-slot是什么?_第8张图片
小结:
v-slot属性只能在上使用,但在只有默认插槽时可以在组件标签上使用
默认插槽名为default,可以省略default直接写为v-slot
缩写为#时不能不写参数,写成#default
可以通过解构获取v-slot={user},还可以重命名v-slot=”{user:newName}“和定义默认值v-slot=”{user=”默认值“}“

4、原理分析
slot本质上是返回Vnode的函数,一般情况下,vue中的组件要渲染到界面上需要经过template->render function->Vnode->DOM过程,这里看slot如何实现:
编写一个butterCounter组件,使用匿名插槽。
vue2-slot是什么?_第9张图片
使用该组件
vue2-slot是什么?_第10张图片
获取butterCounter组件渲染函数
vue2-slot是什么?_第11张图片
_v表示一个普通的文本节点,_t表示渲染插槽的函数
渲染插槽函数renderSlot(做了简化)
vue2-slot是什么?_第12张图片
name属性表示定义插槽的名字,默认值为default,fallback表示子组件中的slot节点的默认值。
关于this.$scopredSlots是什么,我们可以先看vm.slot
vue2-slot是什么?_第13张图片
resolveSlots函数会对children节点做归类和过滤处理,返回slots
vue2-slot是什么?_第14张图片
vue2-slot是什么?_第15张图片
_render渲染函数通过normalizeScopedSlots得到下方变量
vue2-slot是什么?_第16张图片
作用于插槽中父组件能够得到子组件的值是因为renderSlot的时候执行会传入props,也就是上述_t第三个参数,父组件则能够得到子组件传递过来的值。

你可能感兴趣的:(前端,javascript,前端框架)