美文网首页前端开发那些事儿
vue源码解读--组件更新(子组件的更新流程)

vue源码解读--组件更新(子组件的更新流程)

作者: 习惯水文的前端苏 | 来源:发表于2021-02-22 21:46 被阅读0次

目录导航

上一节我们分析到,vue在diff过程中将对子组件进行更新,调用子组件的prepatch,继而执行updateChildComponent。在updateChildComponent做props更新过程中将触发set发布广播触发watcher的update,继而执行子组件的patch,传入的新旧节点为:上一次渲染vnode、当前渲染vnode

\star 组件节点是没有节点类型的,故isRealElement为false

\star 执行sameVnode,本次的tag分别是ul和div,故返回false

\star 拿到旧节点的根元素ul,父元素main

\star 调用createElm,入参为:当前渲染vnode、[]、id为app的main元素、文本节点

\star 当前的vnode非组件vnode,故createComponent为false

\star 代码向下,data={attr:{id:"child"}}

\star children="我是flag"

\star tag="div"

\star vnode.elm=调用原生dom api创建的div元素

\star 调用createChildren,创建子元素,本次示例只有一个文本元素"我是flag"

\star 调用insert,此时页面将显示出"我是falg"和旧的"1"

回到patch,执行update,更新在父vnode中保存的占位的组件vnode

\star ancestor=旧的组件vnode

\star patchable=true。这是因为当前的vnode非组件vnode,其存在真实可挂载的dom节点tag

\star 执行while循环,首先对模块执行销毁工作,这正好对应了在更新过程中添加的元素模块,如id、ref等。代码向下,如果是真实的dom节点,则重新挂载模块(可参考上一节中对cbs.update的分析)

(也就是说,while实际上是先递归的<可能存在组件嵌套的情况>向上将模块销毁,后添加一遍)

代码向下,执行destory,删除旧节点

相关文章

网友评论

    本文标题:vue源码解读--组件更新(子组件的更新流程)

    本文链接:https://www.haomeiwen.com/subject/vgmnxltx.html