You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionresolveSlots(children,context){if(!children||!children.length){return{}}varslots={};for(vari=0,l=children.length;i<l;i++){varchild=children[i];vardata=child.data;// remove slot attribute if the node is resolved as a Vue slot nodeif(data&&data.attrs&&data.attrs.slot){deletedata.attrs.slot;}// named slots should only be respected if the vnode was rendered in the// same context.if((child.context===context||child.fnContext===context)&&data&&data.slot!=null){// 如果slot存在(slot="header") 则拿对应的值作为keyvarname=data.slot;varslot=(slots[name]||(slots[name]=[]));// 如果是tempalte元素 则把template的children添加进数组中,这也就是为什么你写的template标签并不会渲染成另一个标签到页面if(child.tag==='template'){slot.push.apply(slot,child.children||[]);}else{slot.push(child);}}else{// 如果没有就默认是default(slots.default||(slots.default=[])).push(child);}}// ignore slots that contains only whitespacefor(varname$1inslots){if(slots[name$1].every(isWhitespace)){deleteslots[name$1];}}returnslots}
面试官:说说你对slot的理解?slot使用场景有哪些?
一、slot是什么
在HTML中
slot
元素 ,作为Web Components
技术套件的一部分,是Web组件内的一个占位符该占位符可以在后期使用自己的标记语言填充
举个栗子
template
不会展示到页面中,需要用先获取它的引用,然后添加到DOM
中,在
Vue
中的概念也是如此Slot
艺名插槽,花名“占坑”,我们可以理解为solt
在组件模板中占好了位置,当使用该组件标签时候,组件标签里面的内容就会自动填坑(替换组件模板中slot
位置),作为承载分发内容的出口可以将其类比为插卡式的FC游戏机,游戏机暴露卡槽(插槽)让用户插入不同的游戏磁条(自定义内容)
放张图感受一下
二、使用场景
通过插槽可以让用户可以拓展组件,去更好地复用组件和对其做定制化处理
如果父组件在使用到一个复用组件的时候,获取这个组件在不同的地方有少量的更改,如果去重写组件是一件不明智的事情
通过
slot
插槽向组件内部指定位置传递内容,完成这个复用组件在不同场景的应用比如布局组件、表格列、下拉选、弹框显示内容等
三、分类
slot
可以分来以下三种:默认插槽
子组件用
<slot>
标签来确定渲染的位置,标签里面可以放DOM
结构,当父组件使用的时候没有往插槽传入内容,标签内DOM
结构就会显示在页面父组件在使用的时候,直接在子组件的标签内写入内容即可
子组件
Child.vue
父组件
具名插槽
子组件用
name
属性来表示插槽的名字,不传为默认插槽父组件中在使用时在默认插槽的基础上加上
slot
属性,值为子组件插槽name
属性值子组件
Child.vue
父组件
作用域插槽
子组件在作用域上绑定属性来将子组件的信息传给父组件使用,这些属性会被挂在父组件
v-slot
接受的对象上父组件中在使用时通过
v-slot:
(简写:#)获取子组件的信息,在内容中使用子组件
Child.vue
父组件
小结:
v-slot
属性只能在<template>
上使用,但在只有默认插槽时可以在组件标签上使用default
,可以省略default直接写v-slot
#
时不能不写参数,写成#default
v-slot={user}
,还可以重命名v-slot="{user: newName}"
和定义默认值v-slot="{user = '默认值'}"
四、原理分析
slot
本质上是返回VNode
的函数,一般情况下,Vue
中的组件要渲染到页面上需要经过template -> render function -> VNode -> DOM
过程,这里看看slot
如何实现:编写一个
buttonCounter
组件,使用匿名插槽使用该组件
获取
buttonCounter
组件渲染函数_v
表示穿件普通文本节点,_t
表示渲染插槽的函数渲染插槽函数
renderSlot
(做了简化)name
属性表示定义插槽的名字,默认值为default
,fallback
表示子组件中的slot
节点的默认值关于
this.$scopredSlots
是什么,我们可以先看看vm.slot
resolveSlots
函数会对children
节点做归类和过滤处理,返回slots
_render
渲染函数通过normalizeScopedSlots
得到vm.$scopedSlots
作用域插槽中父组件能够得到子组件的值是因为在
renderSlot
的时候执行会传入props
,也就是上述_t
第三个参数,父组件则能够得到子组件传递过来的值参考文献
The text was updated successfully, but these errors were encountered: