React 中 setState使用小結(jié)
最近復(fù)習(xí)了一些關(guān)于react的基礎(chǔ),記錄一下,setState使用的細(xì)節(jié)。
setState的異步更新
自定義事件中為異步更新
<div> <h2>{this.state.message}</h2> <button onClick={e => this.changeText()}>改變文本</button> </div>
changeText() { this.setState({ message: "Hello React" }) console.log(this.state.message); // Hello World, 并不能同步拿到最新值 Hello React }
為什么setState設(shè)計(jì)為異步呢?
setState設(shè)計(jì)為異步,可以顯著的提升性能;
如果每次調(diào)用setState都進(jìn)行一次更新,那么意味著render函數(shù)會(huì)被頻繁調(diào)用,界面重新渲染,這樣效率是很低的;最好的辦法應(yīng)該是獲取到多個(gè)更新,之后進(jìn)行批量更新;
如果同步更新了state,但是還沒(méi)有執(zhí)行render函數(shù),那么state和props不能保持同步;state和props不能保持一致性,會(huì)在開(kāi)發(fā)中產(chǎn)生很多的問(wèn)題
及時(shí)獲取到setState異步更新后的值:
1.setState(partialState, callback) 通過(guò)回調(diào),callback方法獲取,
changeText() { this.setState({ message: "Hello React" }, () => { console.log(this.state.message); // Hello React }); }
2.生命周期函數(shù) componentDidUpdate 獲取
componentDidUpdate(prevProps, provState) { console.log(this.state.message); // Hello React }
setState的同步更新
setTimeout 中為同步更新
changeText() { setTimeout(() => { this.setState({ message: "Hello React" }); console.log(this.state.message); // Hello React }, 0); }
原生DOM事件中為同步更新
const btnEl = document.getElementById("btn"); btnEl.addEventListener('click', () => { this.setState({ message: "Hello React" }); console.log(this.state.message); // Hello React })
setState的數(shù)據(jù)合并
使用 Object.assign(target, …sources)來(lái)完成的,每次setState并沒(méi)有直接替換state中的所有數(shù)據(jù),而是覆蓋差異項(xiàng),就是setState中的key項(xiàng)
setState的方法合并
多個(gè)setState連續(xù)執(zhí)行,最終只會(huì)執(zhí)行一個(gè),例子中最后counter只增加了 1
increment() { this.setState({ counter: this.state.counter + 1 }); this.setState({ counter: this.state.counter + 1 }); this.setState({ counter: this.state.counter + 1 }); }
setState(callback) 取消合并,例子中最后counter只增加了 3
increment() { this.setState((state, props) => { return { counter: state.counter + 1 } }) this.setState((state, props) => { return { counter: state.counter + 1 } }) this.setState((state, props) => { return { counter: state.counter + 1 } }) }
總結(jié)
在組件生命周期或React合成事件中,setState是異步; 在定時(shí)器或原生dom事件中,setState是同步;
setState數(shù)據(jù)合并,實(shí)際上是Object.assign(target, …sources)
通過(guò)setState(callback)的方式可取消setState的多個(gè)合并
到此這篇關(guān)于React 中 setState詳解的文章就介紹到這了,更多相關(guān)React setState內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用react實(shí)現(xiàn)手機(jī)號(hào)的數(shù)據(jù)同步顯示功能的示例代碼
本篇文章主要介紹了使用react實(shí)現(xiàn)手機(jī)號(hào)的數(shù)據(jù)同步顯示功能的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04使用React實(shí)現(xiàn)輪播效果組件示例代碼
React剛出來(lái)不久,組件還比較少,不像jquery那樣已經(jīng)有很多現(xiàn)成的插件了,于是自己寫了一個(gè)基于React的輪播效果組件,現(xiàn)在分享給大家,有需要的可以參考借鑒。2016-09-09簡(jiǎn)析React Native startReactApplication 方法
這篇文章主要介紹了React Native startReactApplication 方法簡(jiǎn)析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09淺談react?16.8版本新特性以及對(duì)react開(kāi)發(fā)的影響
本文主要介紹了react?16.8版本新特性以及對(duì)react開(kāi)發(fā)的影響,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Vite+React搭建開(kāi)發(fā)構(gòu)建環(huán)境實(shí)踐記錄
這篇文章主要介紹了Vite+React搭建開(kāi)發(fā)構(gòu)建環(huán)境實(shí)踐,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09react?事項(xiàng)懶加載的三種方法及使用場(chǎng)景
這篇文章主要介紹了react?事項(xiàng)懶加載的三種方法及使用場(chǎng)景,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Webpack3+React16代碼分割的實(shí)現(xiàn)
這篇文章主要介紹了Webpack3+React16代碼分割的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03React 使用recharts實(shí)現(xiàn)散點(diǎn)地圖的示例代碼
這篇文章主要介紹了React 使用recharts實(shí)現(xiàn)散點(diǎn)地圖的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12