vue.js3的设计思路
Vue.js 3 的设计思路
🎈声明式地描述UI
Vue.js 3 是一个声明式的UI框架。设计一个这样的框架,我们需要了解编写前端页面都涉及哪些内容?具体如下:
- DOM元素:是
div
标签还是a
标签。 - 属性:如
a
标签的href
属性,再如id
、class
等通用属性 - 事件:如
click
、keydown
等。 - 元素的层级结构:DOM树的层级结构,既有子节点,又有父节点
如何声明式的描述上述内容呢?
- 使用与
HTML
标签一致的方式来描述 DOM 元素,例如使用<div></div>
来描述一个div
标签。 - 使用与
HTML
标签一致的方式来描述属性,例如<div id='app'></div>
- 使用
:
或v-bind
来描述动态绑定的属性,例如<div :id='Tshe'></div>
- 使用
@
或v-on
来描述事件,例如点击事件<div @click="e"></div>
- 使用与
HTML
标签一致的方式来描述层级结构,例如一个具有span
子节点的div
标签<div><span></span></div>
除了上面这种使用模板来声明式地描述UI之外,还可以使用JavaScript对象来描述,代码如下:
1 | const title = { |
对应到 Vue.js 模板就是:
1 | <h1 @click="handler"><span></span></h1> |
🎈初识渲染器
我们可以使用JS对象来描述真实的DOM结构。那么虚拟DOM又是如何通过渲染函数转为真实DOM后,渲染到页面中的呢? 渲染器的作用就是把虚拟DOM渲染为真实DOM.
假如我们有如下虚拟DOM:
1 | const vNode = { |
接下来,我们需要编写一个渲染器,把上面这段虚拟DOM渲染为真实DOM,renderer函数接收两个参数:vnode虚拟DOM对象与container真实DOM挂载点,渲染器会把虚拟DOM渲染到该挂载点下。
1 | function renderer(vnode,container){ |
渲染器renderer
的实现思路:
- 创建元素
- 为元素添加属性和事件
- 递归遍历
children
创建节点
🎈组件的本质
组件就是一组DOM元素的封装,这组DOM元素就是组件要渲染的内容,因此可以定义函数来描述组件本身的内容。
1 | const MyComponent = function(){ |
这时候的虚拟DOM就是这样的:
1 | const vnode = { |
🎈模板的工作原理
无论是手写虚拟 DOM还是使用模板,都是属于声明式 UI,上文中讲过,需要将虚拟 DOM 转换为真实 DOM,这一过程需要的就是编译器。 编译器和渲染器一样,就是一个程序,编译器的作用就是将模板编译成渲染函数,如下模板:
1 | <div @click="handler">click me</div> |
最终通过编译器编译,会将其转化为渲染函数:
1 | export default { |
对于一个组件来说,最终都是通过渲染函数产生的,然后渲染器把渲染函数返回的虚拟 DOM,渲染为真实 DOM,这就是模板的工作原理,也是Vue.js 渲染页面的流程。
🎈Vue.js是各个模块组成的有机整体
在Vue.js框架设计中,组件的实现依赖于渲染器和编译器,渲染器和编译器之间是互相关联、互相制约的,它们共同构成一个有机整体,不同模块之间互相配合,进一步提升框架性能。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 亦小染のBlog!