深入掌握 react的 setState的工作機(jī)制
react 是單向數(shù)據(jù)流,若想要改變已有組件的外觀,我們只能通過更改組件的 props 或者更新組件的 state。在 react 項目的代碼中我們操作最多的就是 this.setState 方法。下面對 setState 方法進(jìn)行詳細(xì)的說明。
<!--more -->
setState要點(diǎn):react 框架為了提高性能,會對 state 的更新進(jìn)行收集、合并、再進(jìn)行一次批量的狀態(tài)更新。這種機(jī)制常常導(dǎo)致一些意想不到的情況。
setState 有兩種調(diào)用形式:
向 setState 傳遞對象
setState()并不會立即觸發(fā) state 的更新。
//this.state.demo = 1; handleClick = () => { this.setState({demo: 2}); console.log(this.state.demo);// 1 }
1、🔔注意:在 addEventListener、setTimeout、ajax 回調(diào)中 this.setState 是立即觸發(fā)的。
2、setState 會合并更新,可能會造成狀態(tài)更新的丟失
handleClick = () => { this.setState({demo: this.state.demo + 1}); this.setState({demo: this.state.demo + 1}); } //click 之后 demo 為2而不是3
綜上:在同一代碼塊中不要多次調(diào)用 this.setState 方法
react 的 setState 還提供了另一種調(diào)用形式: this.setState(callbackFunc)
this.setState((previousState, currentProps) => { return { ...previousState, foo: currentProps.bar }; });
該語法和直接為 setState 傳遞對象不同,不會合并更新。
// demo + 1 handleSyncStateChange = () => { this.setState({ demo: this.state.demo + 1 }); this.setState({ demo: this.state.demo + 1 }); } // demo + 2 handleAsyncStateChange = () => { this.setState((preState, preProps) => { return { demo: preState.demo + 1 } }); this.setState((preState, preProps) => { return { demo: preState.demo + 1 } }); }
refs
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
React避坑指南之useEffect 依賴引用類型問題分析
這篇文章主要介紹了React避坑指南之useEffect 依賴引用類型問題分析,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03react ant protable自定義實(shí)現(xiàn)搜索下拉框
這篇文章主要介紹了react ant protable自定義實(shí)現(xiàn)搜索下拉框,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06React中useCallback useMemo到底該怎么用
在React函數(shù)組件中,當(dāng)組件中的props發(fā)生變化時,默認(rèn)情況下整個組件都會重新渲染。換句話說,如果組件中的任何值更新,整個組件將重新渲染,包括沒有更改values/props的函數(shù)/組件。在react中,我們可以通過memo,useMemo以及useCallback來防止子組件的rerender2023-02-02基于react項目打包c(diǎn)ss引用路徑錯誤解決方案
這篇文章主要介紹了基于react項目打包c(diǎn)ss引用路徑錯誤解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-10-10React+EggJs實(shí)現(xiàn)斷點(diǎn)續(xù)傳的示例代碼
這篇文章主要介紹了React+EggJs實(shí)現(xiàn)斷點(diǎn)續(xù)傳的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07