Vue3源码系列之patchNode、patchProps以及createRenderer的实现

679 阅读2分钟

第一步

先封装一些dom的操作

元素操作:

Image.png

文本操作:

Image.png

第二步

在src下创建module文件夹,创建4个文件attr.ts、class.ts、event.ts、style.ts

Image.png

在class.ts中

Image.png

如果你传了值为空,那我就直接把以前的删掉,否则就直接把以前的覆盖掉

在style.ts中

Image.png

  • 先判断新的是否有,没有则把整个style清空掉
  • 否则再判断老的属性是否存在,如果存在,循环老的,判断老的属性在不在新的里面,如果不在,说明这个属性被删了,那么我们直接把这个属性赋值为空
  • 然后把新的所有属性赋值到style中
  • 总结:目的就是更新操作,新的不存在全删,新的存在,把老的有,新的没有的属性删掉,然后把新的里面所有属性直接赋值到style中

attr.ts中

Image.png

没有就删除,有新值就更新

events.ts中

Image.png

  • 先缓存函数,vue上的事件都缓存在_vei中,如果没有就去构造一个
  • 如果在缓存中存在当前事件函数,那就把它里面的value替换掉,也就是把函数替换掉
  • 如果在缓存中不存在当前事件函数,把on截取掉,然后把剩下的转换成小写
  • 然后去判断value是否存在,如果存在说明要绑定的事件,以前没绑过,也就是exists是undifined,那么就去创建一个Invoker,缓存到_vei中,并且去创建一个事件
  • 如果value不存在说明以前绑定了,也就是exists存在,那么久去清除对应的事件,从_vei中也清除

最外层patchProp.ts中

Image.png

第三步

在index中整合上述方法,为渲染时提供方法

Image.png

Image.png

extend就是Object.assign

至此,runtime-dom的职责已经写完了,接下来需要用到runtime-core提供的核心方法来处理渲染

Image.png

注:重写mount的原因是· 我想有清空容器的操作

第四步

runtime-core中

提供的createRenderer方法,目的是创建一个渲染器

Image.png

renderer.ts中

Image.png

我们现在把createApp抽离出去,抽离到apiCreateApp.ts

apiCreateApp.ts中

Image.png

mount中需要做的事情:

  • 根据组件创建虚拟节点
  • 将虚拟节点和容器获取到后调用render方法进行渲染

创建虚拟节点

先保存组件的属性、组件本身以及应用对应的容器

Image.png

createVNode

Image.png

调用render

Image.png

我们下一步就是去写createVNode方法,去创建虚拟节点

如果您觉得有所收获,麻烦动动小手点个攒,谢谢啦~ 预知后事如何,且听下回分解~