上QQ阅读APP看书,第一时间看更新
2.4 mount()函数
mount()函数在首次挂载时执行,可直接将VNode按照层级对DOM元素进行创建、渲染和挂载。具体执行逻辑为:首先在mount()函数内对VNode的props(属性)进行处理,再通过递归的方式处理子节点,待递归完成后,完成VNode树到真实DOM的渲染。
mount()函数的操作与书写DOM结构类似,首先渲染对应标签,其次处理标签内属性,最后处理标签内的值,完成上述步骤即完成一个标签的创建。标签之间的嵌套关系将通过递归的方式进行处理,由最深层级标签开始渲染,直到渲染到根节点标签。创建DOM节点入栈,渲染DOM节点出栈,采用后进先出的方式,保证子节点先渲染,父节点后渲染。
整个mount()函数操作的实现代码如下:
第一步,根据VNode创建最上层标签。
const el = document.createElement(vnode.tag) vnode.el = el
第二步,处理当前节点的props属性。
第三步,创建当前节点的子节点。此处需注意递归渲染子节点时,到最底层必然是具体的字符串,因此可以把子节点是否为string类型作为递归结束的判断条件。如果是string类型,则不用继续递归;如果是数组,则代表仍有子节点,需通过for循环遍历子节点,继续调用mount()函数进行递归渲染。重复上述步骤,最终完成整个VNode树的渲染。涉及代码如下:
props和children处理后,完成整个DOM结构渲染,再将当前元素插入父级元素指定位置,完成整个渲染过程。完整的mount()函数代码如下: