第三章 Vue框架的设计思路

89 阅读2分钟

Vue的运作机制

声明式的描述UI

  • 采用与HTML一致的标签,属性,层级结构来描述UI,即HTML怎么写,Vue就怎么写

  • 使用JavaScript对象来描述,如标签名对应tag属性,属性对应props属性,层级结构通过children描述

  • JS对象描述的形式,就是我们的虚拟DOM。

  • render函数内调用的h函数,Vue维护的工具函数,用于简化虚拟DOM的编写,最终返回的是虚拟DOM

渲染器

  • 如上文所述,渲染器会接收h函数返回的虚拟DOM,将其渲染为真实DOM
  • 渲染过程
    • 将VNode.tag作为标签名,调用Document.createElement来创建一个真实的标签
    • 遍历VNode.props,为真实标签添加所有的属性,遇到以on开头的,则调用addEventListener
    • 遍历children,嵌套调用渲染器进行处理,将当前节点作为子节点的挂载容器

组件的本质

  • 虚拟DOM是对真实DOM的描述
  • 组件是对一组虚拟DOM的封装,会返回需要渲染的虚拟DOM。
  • 渲染器收到虚拟DOM后,判断tag类型,
    • 如果是字符串,调用mountElement函数,根据虚拟DOM创建真实DOM
    • 如果是函数,则调用mountComponent函数,调用tag值,获取真正的虚拟DOM,再调用mountElement

模板的工作原理

  • 模板和虚拟DOM都属于声明式的描述UI
  • 模板本质是字符串,通过编译器编译后构建出AST,将其转换为JS AST(虚拟DOM)

各模块间的配合

  • 编译器将模板编译为渲染函数(返回虚拟DOM),为了渲染器能够更好的渲染,更新,我们在编译时,可以将会发生变更的属性或值,标记出来,这样渲染器更新时,可以直接通过标记来查找替换

总结

  • 我们通过模板来描述真实DOM,通过编译器将模板转为机器可识别的虚拟DOM(subtree)
  • 通过渲染器将虚拟DOM渲染为真实DOM
  • 各模块间紧密配合,共同构成有机整体