最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Vue源码之插槽slot

    正文概述 掘金(派大星的黑板报)   2021-03-19   583

    新版普通插槽

    父组件编译阶段之parse

    Vue源码之插槽slot
    Vue源码之插槽slot
    Vue源码之插槽slot

    1.在闭合标签后执行closeElement,然后执行processElement执行processSlotContent(element)。

    2.首先执行getAndRemoveAttrByRegex遍历el.attrsList找到插槽指令的那条对象返回。

    3.如果存在插槽指令的对象,通过getSlotName函数获取到插槽的名字和dynamic。设置当前插槽节点的slotTarget为插槽名,设置slotTargetDynamic为dynamic,设置slotScope如果存在value就设置value否则设置为empty

    4.processSlotContent执行完后接着执行processSlotOutlet,函数判断节点tag是否等于slot,显然是不成立的。接着就返回当前插槽节点的ast。

    5.processElement执行完后接着会判断当前插槽节点是否存在slotScope,如果存在,获取插槽的名字,如果没有名字就设置为默认值default,接着就是重构demo的ast节点,为demo ast树添加scopedSlots对象,scopedSlots 对象是插槽定义名为key和插槽节点ast树为value。为demo ast树添加children属性由每个插槽ast树组成的数组。设置插槽节点ast树的parent 为demo ast树。

    6.最后还会遍历demo ast树的children删除作用域插槽的值,最终children为空数组。

    父组件编译阶段之generate

    Vue源码之插槽slot
    Vue源码之插槽slot

    1.执行到generate阶段,执行genElement,执行genData,因demo ast节点存在scopedSlots接着执行genScopedSlots函数。

    2.genScopedSlots,首先遍历scopedSlots获取key对应的value调用genScopedSlot,genScopedSlot最终返回一个对象插槽名和插槽执行的函数。最后拼接插槽的render表达式。

    父组件render & patch

    Vue源码之插槽slot

    1.父组件render时,遇到组件标签创建组件占位符vnode,七中占位符vnode中的data属性就是父组件generate阶段生成的data对象,里面就有scopedSlots。render执行完后执行patch阶段。

    2.patch时创建子组件执行子组件的init钩子函数,调用createComponentInstanceForVnode传入占位符vnode,设置组件实例options的_parentVnode属性为占位符vnode。然后组件初始化执行initInternalComponent。

    3.initInternalComponent首先设置组件的Vue源码之插槽slotoptions的_parentVnode属性为占位符vnode。

    子组件编译阶段之parse

    Vue源码之插槽slot
    Vue源码之插槽slot
    Vue源码之插槽slot

    1.在闭合标签后执行closeElement,然后执行processElement执行processSlotContent(element),processSlotContent条件不满足啥也不干。

    2.接着执行processSlotOutlet,函数判断节点tag是否等于slot,显然成立。设置节点.slotName的值为name属性定义的值如果没有设置为undefined。

    子组件编译阶段之generate

    Vue源码之插槽slot
    Vue源码之插槽slot

    1.执行到generate阶段,执行genElement,存在tag为slot执行genSlot函数。

    2.genSlot函数首先获取节点的slotName也就是插槽名,不存在设置为default,接着如果存在默认值就对默认值进行处理,最后返回_t拼接的render表达式。

    子组件render

    Vue源码之插槽slot
    Vue源码之插槽slot
    image.png

    新版作用域插槽

    作用域插槽与普通插槽最大的不同就是子组件generate阶段,会对标签的attrs属性和bind指令进行处理,生成的渲染函数会有不同。然后在render阶段接收到传入参数执行插槽函数。

    Vue源码之插槽slot
    Vue源码之插槽slot

    新版本插槽总结

    Vue源码之插槽slot

    ⽗组件在编译和渲染阶段并不会直接⽣成 vnodes,⽽是在⽗节点 vnode 的 data 中保留⼀个 scopedSlots 对象,存储着不同名称的插槽以及它们对应的渲染函数,只有在编译和渲染⼦组件阶段才会执⾏这个渲染函数⽣成vnodes,由于是在⼦组件环境执⾏的,所以对应的数据作⽤域是⼦组件实例。

    旧版本的普通插槽(前身)

    Vue源码之插槽slot
    Vue源码之插槽slot
    1. 解析ast时会把插槽内容解析成ast插入到demo节点的children中。
    Vue源码之插槽slot
    Vue源码之插槽slot
    Vue源码之插槽slot
    image.png
    Vue源码之插槽slot
    Vue源码之插槽slot
    Vue源码之插槽slot

    这里就可以看到子组件render时冲组件实例的$slots属性中根据插槽名拿到对应的VNode进行渲染。

    旧版本插槽总结

    旧版本的普通插槽是在⽗组件编译和渲染阶段⽣成 vnodes ,所以数据的作⽤域是⽗组件实例,⼦组件渲染的时候直接拿到这些渲染好的vnodes。对于作用域插槽跟新版的一样。


    起源地下载网 » Vue源码之插槽slot

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元