| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> Vuejs 设计与实现 —— 渲染器核心:挂载与更新 -> 正文阅读 |
|
[JavaScript知识库]Vuejs 设计与实现 —— 渲染器核心:挂载与更新 |
前言挂载 与 更新 是 渲染器 的核心功能,也是渲染器应该要提供的基本功能,而 挂载 和 更新 又是基于 VNode 虚拟节点的,因为 VNode 节点描述了其对应的 真实 DOM 应该是什么样子的。 挂载与卸载VNode 节点无论是 vue 还是 react 都引入了 虚拟 DOM,只不过它们定义 虚拟 DOM 的结构不同,但本质上都只是一个普通的 JavaScript 对象。 VDOM 和 VNode 是从 本质上 看是一个东西,因为 VDOM 由 VNode 节点组成,每个 VNode 节点也能代表局部 VDOM,上篇文章中也提到过:VNode 和 VDOM 是可以互换的。 但从 整体上 看显然 VDOM 是包含或者等于 VNode,也就是说从严格意义上来讲,它们并不是一直相等的,取决于你的 VNode 节点的个数,如果它的节点数量是 1 那么它们是相等的。 不过现在所谈论的 VNode 就是 VDOM,谈论的 VDOM 就是 VNode,这只不过是一个简单的概念,不必过于纠结。 下面是 Vue3.x 中定义最基本的 VNode 结构: vnode.type 是节点类型:标签、文本、注释、Fragment、Component 等
设置正确的元素属性HTML Attributes 和 DOM PropertiesHTML Attributes 指的就是定义在 HTML 标签上的属性,如:id=“app”、type=“text”、value=“hello world” 等等 DOM Properties 指的是通过 JavaScript 来访问真实 DOM 元素时能够访问到的属性,很多 HTML Attributes 都能在 DOM Properties 上存在同名属性(如:el.id、el.title)等,不同名属性(如:el.className、el.textContext)等 核心原则:HTML Attributes 的作用是设置 DOM Properties 的 初始值 正确处理普通的 props通过 in 操作符判断 props.key 是否存在 el(即 DOM Properties) 上 特殊处理 classVue.js 对 class 做了增强: 指定 class 为普通 字符串 源码中通过 normaliz 处理不同的 class 类型,并统一返回字符串形式: 选择设置 class 最合适的方式浏览器中设置 class 的方式有三种:el.className、el.classList、el.setAttribute,既然有多种方式,那么在选择时肯定要选择最优的设置方式,而其中最优的方式就是 el.className 可以做个小测试,时间不一定准确,但是差值却很明显:
事件处理区分事件在虚拟 DOM 中,事件可以被看作是一种特殊的属性,在 vue 中约定 vnode.props 对象中,凡是以字符串 on 开头的属性都视为 事件.
注册和更新事件注册事件 通过 el.addEventListener 的方式进行注册即可,那如何实现 更新事件 呢? 最简单的方法: 移除 之前的事件处理函数 确实有,vue 中也是这么设计的: 伪造一个事件处理函数 invoker.value,将真正的事件处理函数设置为 invoker.value 属性的值 挂载节点 首次调用 patch 函数时,n1 = null 因为是挂载阶段,因此没有旧 vnode,当 patch 函数执行时,会递归调用 mountElement 函数完成挂载 卸载操作卸载操作实际上是发生在更新阶段,这里的更新时指,在初次挂载完成之后,后续渲染还会触发更新,只不过新 vnode 会变成 null,从而进入卸载阶段: 容器的内容可能是某个或多个组件渲染的,当卸载发生时,应该正确地调用这些组件的 beforeUnmount、unmounted 等生命周期函数 更新子节点最佳方式对于一个元素来说,其子节点拥有以下 3 种情况: 没有子节点,即 vnode.children = null 而在的实际的代码中,并不需要罗列去处理以上的所有情况,而更新方式必然也不是采用 “笨方式”:卸载所有子节点,在挂载所有新节点,更好的做法是,通过 Diff 算法比较新旧两组子节点,试图最大程度复用 DOM 元素。 源码附件已经打包好上传到百度云了,大家自行下载即可~
如果百度云链接失效了的话,请留言告诉我,我看到后会及时更新~ 开源地址码云地址: Github 地址: 开源不易,Star 以表尊重,感兴趣的朋友欢迎 Star,提交 PR,一起维护开源项目,造福更多人! |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 16:42:36- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |