網站首頁 編程語言 正文
react怎么檢測到數據的變化?
react狀態變化只能通過setState(),調用setState()就會更新狀態重新渲染dom
為什么不直接更新state?
- 如果試圖直接更新state,則不會重新渲染組件
- 需要使用setState()方法去更新state,它調度對組件state對象的更新,組件通過重新渲染來響應
react中,在執行setState()方法后發生了什么?
咱們可以將“render”分為兩個步驟:
- 虛擬DOM渲染:
當render方法被調用時,它會返回一個新的組件的虛擬DOM結構。當調用setState()時,render會被再次調用因為默認情況下shouldComponentUpdate總會返回true,所以默認情況下react是沒有優化的。
? ? ?2. ?原生DOM渲染:
react只會在虛擬DOM中修改真實DOM節點,而且修改的次數非常少,優化了真實DOM的變化,使得react變得更快。
setState()是同步的還是異步的?
看setState具體的執行位置:
- 在react控制的回調函數中【異步】:生命周期鉤子/react事件回調
- 非react控制的異步回調函數中【同步】:定時器回調/原生事件監聽回調/promise回調
setState的“異步”并不是說內部由異步代碼實現,其實本身執行的過程和代碼都是同步的,只是合成事件和鉤子函數的調用順序在更新之前,導致在合成事件和鉤子函數中沒法立馬拿到更新后的值,形成了所謂的“異步”,咱們也可以通過第二個參數setState(partialState,callback)中的callback拿到更新后的結果,該callback接收上一個state的值和當前的props,并返回一個新的狀態。
setState的批量更新優化也是建立在“異步”(合成事件、鉤子函數)的基礎上。
在原生事件和setTimeout中不會批量更新,在“異步”中如果對同一個值進行多次setState,setState的批量更新政策會對其進行覆蓋,取最后一次的執行,如果是同時setState多個不同的值,在更新時會對其進行合并批量更新。
setState為什么會進行異步操作?
- 保持內部一致性:props的更新是同步的,因為render父組件時,傳入子組件的props才會發生變化,為了保持數據的一致性,state也不直接更新,都是flush時才更新。
- 將state的更新延緩到最后批量合并再去渲染對應用的性能優化是具有極大好處的,如果每次的狀態改變都回去重新渲染真實的DOM,將會帶來巨大的性能消耗。
- 立即更新回來視覺上的不適應,比如在頁面打開的時候,多個請求發布導致頻繁更改Loading,會導致Loading圖標閃爍。
關于異步的setState()
- 多次調用,怎么處理?
setState({}):合并更新一次狀態,只調用一次render()更新界面---狀態更新和頁面更新都合并了
setState(fn):更新多次狀態,但只調用一次render()更新頁面---狀態更新沒有合并,但界面更新合并了
? ? 2.?如何得到異步更新后的狀態數據?
在setState()的callback回調函數中。
原文鏈接:https://blog.csdn.net/qq_45679015/article/details/124317702
相關推薦
- 2022-06-25 pytorch中permute()函數用法補充說明(矩陣維度變化過程)_python
- 2022-12-25 Redis中AOF與RDB持久化策略深入分析_Redis
- 2022-11-10 Android中PopupWindow彈出式窗口使用方法詳解_Android
- 2022-10-28 Go語言包和包管理詳解_Golang
- 2024-01-29 Linux信號量以及基于環形隊列的生產者消費者模型
- 2022-06-13 docker從安裝入門到應用部署及私有倉庫搭建基礎命令_docker
- 2022-09-29 kotlin源碼結構層次詳解_Android
- 2022-11-08 Golang連接并操作PostgreSQL數據庫基本操作_Golang
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支