一、JSX本质
JSX等同于Vue的模板
Vue模板不是html 而是一个render函数 JXS也不是JS 本质就是createElement函数
React.createElement类似于h函数,但传参不同,子元素可以不写成数组 返回的也是node
第一个参数不一定是tag名 也可以是组件名 如Input(React中组件名首字母必须大写!)
用void(0) 代表this
style:
加载组件:
事件
列表
二、合成事件
dispatchEvent:派发事件
合成事件机制:
- 为了更好的兼容性和跨平台 虽然不能完全脱离DOM事件 但尽可能地拜托DOM的逻辑
- 挂载到document减少内存消耗 避免频繁解绑
三、batchUpdate和setState
之前学过了
setState有时候异步 有时候同步 有时候合并 有时候不合并 那这是为什么呢!
setState主流程:
异步走左边 (dirtyComponents 就是现在state已经被更新的components)先把组件存进去
同步左右边
这是因为,我们设置了isBatchingUpdates 通过判断这个值 来决定是否为batch update
所以setState本身无所谓异步还是同步 就是看它是否命中batchUpdate机制
可以命中batchupdate机制的:
- 生命周期(和它调用的函数)
- React中注册的事件
- 总之是React可以“管理”的入口
不能命中的:
- setTimeout setInterval
- 自定义DOM事件
- 总之是React管不着的入口
四、transaction
流程图:
也就是先执行initialize 后执行方法 最后执行close
简单例子,感受一下:
这就是一个机制 服务于batchUpdate
五、组件渲染更新
一些要点:
- JSX如何渲染为页面
- setState之后如何更新页面
渲染时:
- 拿到props state
- render生成vnode
- 使用patch渲染到页面上
- setState(newState)生成dirtyComponents(可能有子组件)
- render生成newVnode
- 使用patch渲染到页面上
- patch又被拆分两个阶段:
- 阶段1:reconciliation阶段 执行diff算法 纯JS计算
- 阶段2:commit阶段 将idff结果渲染在DOM中
reconciliation阶段还可以继续拆分 通过window.requestIdleCallback 判断DOM需要渲染时暂停 空闲时恢复
这种方法就叫做fiber