生活是活给自己看的,你有多大成色,世界才会给你多大脸色。
今日学习内容
1、https://www.youtube.com/watch?v=EVFZazcxAbo&t=4112s
今日笔记
setState
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| import React from 'react'; import './style.css';
export default class App extends React.Component { state = { count: 0, };
increment = () => { console.log('Incrementing count', this.state.count); this.setState({ count: this.state.count + 1 }) console.log('Count after increment', this.state.count); }
triple = () => { console.log('Tripling count', this.state.count); this.setState((prevState) => ({ count: prevState.count + 1 }));
this.setState((prevState) => ({ count: prevState.count + 1 }));
this.setState((prevState) => ({ count: prevState.count + 1 })); console.log('Count after tripling', this.state.count); }
reduce = () => { setTimeout(() => { console.log('Reducing count', this.state.count); this.setState({ count: this.state.count - 1 }); console.log('Count after reducing', this.state.count); }, 0); }
render() { return ( <div className="App"> <h1>Count: {this.state.count}</h1> <button onClick={this.increment}>Increment</button> <button onClick={this.triple}>Triple</button> <button onClick={this.reduce}>Reduce</button> </div> ); } }
|


批量更新:
每来一个setState,就把它塞进一个队列里存起来等时机成熟,在把state结果做合并,最后针对最新的state值更新
参考vue的nextTick、浏览器的Event Loop

setState工作流:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| ReactComponent.prototype.setState = function(partialState, callback) { this.updater.enqueueSetState( this, partialState, ); if(callback) { this.updater.enqueueCallback( this, callback, 'setState' ); } };
enqueueSetState: function(publicInstance, partialState){ var internalInstance = getInternalInstanceReadyForUpdate( publicInstance, 'setState' );
var queue = internalInstance._pendingStateQueue || (internalInstance._pendingStateQueue = []); queue.push(partialState);
enqueueUpdate(internalInstance); }
|