|
|
|
@ -80,12 +80,15 @@ createInstance 会调用 createElement 方法创建一个 DOM 实例,并调用
@@ -80,12 +80,15 @@ createInstance 会调用 createElement 方法创建一个 DOM 实例,并调用
|
|
|
|
|
|
|
|
|
|
### diffProperties |
|
|
|
|
|
|
|
|
|
函数开始会先执行对 props 属性的校验方法:`validatePropertiesInDevelopment` 方法,然后根据 Fiber tag 进入不同的case,这里只有针对三种 tag有特殊的处理,分别是:input、select 和 textarea,本次进入 completeWork 的 Fiber 节点 tag 为 img,所以不会进入 特殊处理的 case,最终进入到 default 逻辑,然后被直接 break,去往 assertValidProps 函数 |
|
|
|
|
函数开始会先执行对 props 属性的校验方法:`validatePropertiesInDevelopment` 方法,然后根据 Fiber tag 进入不同的 case,这里只有针对三种 tag有特殊的处理,分别是:input、select 和 textarea,本次进入 completeWork 的 Fiber 节点 tag 为 img,所以不会进入 特殊处理的 case,最终进入到 default 逻辑,然后被直接 break,去往 assertValidProps 函数 |
|
|
|
|
这里还有一个针对 Fiber 旧 props 属性 onClick 不是 function 且 新 props 属性 onClick 是 function 的一个特殊处理:就是直接给 DOM 的 onclick 属性赋值为一个空函数 ,从官方留下的注释中大概可以知道,这似乎是为了修复 Safari 浏览器的问题的特殊处理 |
|
|
|
|
|
|
|
|
|
### assertValidProps |
|
|
|
|
|
|
|
|
|
函数一开始会检查 props 是否存在,不存在直接 return |
|
|
|
|
然后就是一大串的 if 用于对 props 是否合法的兜底操作,比如说 dangerouslySetInnerHTML 属性和 children 属性智能存在一个之类的,如果找到不合法的操作会直接通过 throw Error 被抛出 |
|
|
|
|
|
|
|
|
|
之后就进入 diffProperties 最主要的任务:对新旧 props 进行对比然后生成 updateQueue |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|