源码看React setState漫谈(一)
一张图看懂React setState操作网上关于react setState的结论不少,比如:
但你是否真的了解setState背后的机制?真的是setState触发的刷新吗? 组件挂载后,setState一般是通过DOM交互事件触发。这里以 代码很简单 import React,{Component} from 'react'; class MyInfo extends Component{ constructor(props,context){ super(props,context); this.state = { age:1 } } _grow(age){ age++ this.setState({ age:age }) } render(){ const {age} = this.state return ( <div> 我的年龄是{age} <button onClick={this._grow.bind(this,age)}>点击涨一岁</button> </div> ) } } export default MyInfo; 我们点击button按钮时,到底发生了什么?ReactEventListener会触发dispatchEvent方法。(具体怎么触发是事件机制的事,这里不深究) dispatchEvent: function (topLevelType,nativeEvent) { if (!ReactEventListener._enabled) { return; } var bookKeeping = TopLevelCallbackBookKeeping.getPooled(topLevelType,nativeEvent); try { // Event queue being processed in the same cycle allows // `preventDefault`. ReactUpdates.batchedUpdates(handleTopLevelImpl,bookKeeping); } finally { TopLevelCallbackBookKeeping.release(bookKeeping); } } 可以看到这里有个 function batchedUpdates(callback,a,b,c,d,e) { ensureInjected(); return batchingStrategy.batchedUpdates(callback,e); } 可以发现这里调用了 batchedUpdates: function(callback,e) { var alreadyBatchingUpdates = ReactDefaultBatchingStrategy.isBatchingUpdates; ReactDefaultBatchingStrategy.isBatchingUpdates = true; // The code is written this way to avoid extra allocations if (alreadyBatchingUpdates) { return callback(a,e); } else { return transaction.perform(callback,null,e); } },
var transaction = new ReactDefaultBatchingStrategyTransaction(); //在事务结束时清理一下标识 var RESET_BATCHED_UPDATES = { initialize: emptyFunction,close: function() { ReactDefaultBatchingStrategy.isBatchingUpdates = false; },}; // 在事务结束时执行flushBatchedUpdates方法,这个方法就是 state 更新的核心代码了。 var FLUSH_BATCHED_UPDATES = { initialize: emptyFunction,close: ReactUpdates.flushBatchedUpdates.bind(ReactUpdates),}; var TRANSACTION_WRAPPERS = [FLUSH_BATCHED_UPDATES,RESET_BATCHED_UPDATES]; function ReactDefaultBatchingStrategyTransaction() { this.reinitializeTransaction(); } Object.assign(ReactDefaultBatchingStrategyTransaction.prototype,Transaction,{ getTransactionWrappers: function() { return TRANSACTION_WRAPPERS; },}); 可以发现这个transition有两个wrapper,主要看 目前走完了图中的第一行,有点晕的可以对着图回顾一下。 - 是不是发现哪里不对?是的,到现在我们的setState还没执行呢! ReactUpdates.batchedUpdates(handleTopLevelImpl,bookKeeping); 也就是执行这边的 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |