目录
扩展学习资料
React Reconciliation
Stack Reconciler【15版本、栈协调】
Stack Reconciler-事务性
事务性带来的弊端:
名称 |
链接 |
备注 |
官方文档 |
Reconciliation – React |
英文 |
stack reconciler |
Implementation Notes – React |
英文 |
react fiber |
What is React Fiber ? | Giamir Buoncristiani |
英文 |
React Fiber 初探 |
React Fiber 初探 - 掘金 |
|
React Fiber 架构 |
React Fiber架构 - 知乎 |
react协调:Virtual Dom转化成真实UI的过程
主要协调方式:
React的初次渲染
class App extends React.Component {
render() {
const {text} = this.state;
return react 15.6.2 first render;
}
}
代码图示
.jsx文件通过babel转义调用react的createElement
// 即将渲染的组件,挂载节点, 回调函数
render: function (nextElement, container, callback) {
return ReactMount._renderSubtreeIntoContainer(null, nextElement, container, callback)
}
var component = ReactMount._renderNewRootComponent(nextWrappedElement, container, shouldReuseMarkup, nextContext)
._renderedComponent.getPublicInstance();
// 初始化React组件的方法
var componentInstance = instantiateReactComponent(nextElement, false);
instance = new ReactCompositeComponentWrapper(element);
// react所有组件包装器,继承了react所有组件
var CompositeTypes = { // 对react组件进行收敛,通过传进的类型,进行组件类型判断
ImpureClass: 0,
PureClass: 1,
StatelessFunctional: 2
};
// 组件渲染到dom的重要方法
var markup = ReactReconciler.mountComponent(wrapperInstance, transaction, null,
ReactDOMContainerInfo(wrapperInstance, container), context, 0 /* parentDrbugID */);
// 批量挂载
// batchedMountComponentIntoNode(markup)
// 组件挂载到html节点
// mountComponentIntoNode(markup)
ReactMount._mountImageIntoNode(markup, container, wrapperInstance, shouldReuseMarkup, transaction);
DOMLazyTree.insertTreeBefore(container, markup, null);
// 最底层的DOM API执行插入/更新HTML节点
1. enqueueSetState setState 常规的调用执行函数
2. enqueueCallback setState 带回调函数的执行函数
通常props发生改变,也会触发再次渲染,不过更多的处理逻辑是在
componentWillReceiveProps里面执行一些逻辑判断,最后执行this.setState方法
enqueueUpdate
if(!batchingStrategy.isBatchingUpdates) {// 通常会是true,所以setState是异步
batchingStrategy.batchedUpdates(// 更新策略-批量更新
enqueueUpdate,// 更新队列
component, // 更新组件
);
return;
}
// 待更新,组件数组
dirtyComponents.push(component);
if (component._updateBatchNumber == null) {
// 待更新数+1
component._updateBatchNumber = updateBatchNumber + 1;
}
由事务性导致它的更新是一气呵成的,在组件比较复杂,耗时比较长的时候,与此同时,如果有用户输入、点击。【浏览器没有将这些事件定义为高优先级,一视同仁】就会比较卡顿,因为大部分运算还是在处理更新渲染。【渲染过程不可阻断,一旦页面更新过于复杂,耗时过长,页面操作就会卡顿】
setState是大部分情况是异步的【onClick,onChange,组件生命周期调用】
setState不处于事务性更新过程时,是同步的【新的更新周期时是立刻执行的】