React中setState的使用與同步異步的使用
在react中,修改狀態(tài)如果直接使用this.state,不會(huì)引起組件的重新渲染,需要通過 this.setState來對(duì)組件的屬性進(jìn)行修改。
1、this.setState的兩種定義方式
定義初始狀態(tài)
state = { count: 0 },
如果此時(shí)有一個(gè)按鈕,點(diǎn)擊按鈕讓計(jì)數(shù)加1,我們可以有兩種寫法
(1)傳遞對(duì)象
this.setState({ count: this.state.count + 1})
(2)傳遞函數(shù)
this.setState((state, props) => ({ count: count + 1}))
2、setState的兩種方式有什么不同?
如果變更的state的值需要依賴于上一次的state的值,這種情況就需要用到函數(shù)的形式,比如以下這種情況
addCount(){ this.setState({ count: this.state.count + 1}) this.setState({ count: this.state.count + 1}) this.setState({ count: this.state.count + 1}) }
此時(shí)只會(huì)執(zhí)行一次+1的操作,因?yàn)樵赗eact內(nèi)部,會(huì)將多次setState合并操作,新的state由 Object.assgin({}, {count: 0}, { count: 1}) 合并所得,以上賦值會(huì)執(zhí)行三次,但因?yàn)閏ount的值沒有更新,所以最終執(zhí)行的結(jié)果只+1,如果setState的賦值是函數(shù),那情況就不一樣了
addCount(){ this.setState((state, props) => ({ count: count + 1})) this.setState((state, props) => ({ count: count + 1})) this.setState((state, props) => ({ count: count + 1})) }
這樣的操作會(huì)得到+3的效果,因?yàn)镽eact會(huì)進(jìn)行判斷,如果傳入的是函數(shù),那么將執(zhí)行此函數(shù),此時(shí)count的值就已經(jīng)被修改了
3、setState是同步還是異步的?
☆☆☆☆☆ 是異步的
(1) 即我們通過this.setState修改了狀態(tài)之后,在它的下一行輸出state的值并不會(huì)得到新的值
(2) 為什么是異步?
有兩個(gè)原因,一是提高效率,每次修改state的值都會(huì)造成render的重新渲染,將多次修改state的值合并統(tǒng)一更新可以提高性能;二是render的更新會(huì)晚一些,如果render中有子組件,子組件的props依賴于父組件的state,props和state就不能保持一致
(3) 如何獲取異步時(shí)的state值?
① 在setState的回調(diào)函數(shù)中
this.setState({ count: this.state.count + 1}}, ()=>{ console.log(this.state.count)})
② 在componentDidUpdate中獲取
componentDidUpdate(){ console.log(this.state.count) }
☆☆☆☆☆ 是同步的
(1) 即我們通過this.setState修改狀態(tài)之后,在它的下一行輸出state是新的值
(2) 什么場(chǎng)景下是同步的?
① 原生js獲取dom元素,并綁定事件
<button id="addBtn">點(diǎn)我+1</button> componentDidMount(){ const addBtn = document.getElementById('addBtn') changeBtn.addEventListener('click',()=>{ this.setState({ count: this.state.count + 1}) console.log(this.state.message) }) }
② 計(jì)時(shí)器 setTimeout
<button onClick={ e => this.addOne() }>點(diǎn)我+1</button> addOne(){ setTimeout(()=>{ this.setState({ count: this.state.count + 1 }) console.log(this.state.count ) },0) }
到此這篇關(guān)于React中setState的使用與同步異步的使用的文章就介紹到這了,更多相關(guān)React setState同步異步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解create-react-app 自定義 eslint 配置
這篇文章主要介紹了詳解create-react-app 自定義 eslint 配置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06React-Native實(shí)現(xiàn)ListView組件之上拉刷新實(shí)例(iOS和Android通用)
本篇文章主要介紹了React-Native實(shí)現(xiàn)ListView組件之上拉刷新實(shí)例(iOS和Android通用),具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07React關(guān)于antd table中select的設(shè)值更新問題
這篇文章主要介紹了React關(guān)于antd table中select的設(shè)值更新問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03react后臺(tái)系統(tǒng)最佳實(shí)踐示例詳解
這篇文章主要為大家介紹了react后臺(tái)系統(tǒng)最佳實(shí)踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01React實(shí)現(xiàn)Excel文件的導(dǎo)出與在線預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹了如何利用?React?18?的強(qiáng)大功能,演示如何使用?React?18?編寫?Excel?文件的導(dǎo)出與在線預(yù)覽功能,需要的小伙伴可以參考下2023-12-12