自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

UseState是干啥的?有哪些坑?

開發(fā) 前端
看下控制臺(tái),你會(huì)發(fā)現(xiàn)有個(gè)問題,每次todolist組件重新渲染的時(shí)候,createInitialTodos方法都會(huì)重新運(yùn)行一次,但是,只有第一次的返回結(jié)果被useState使用,如果createInitialTodos在做非常耗時(shí)的計(jì)算的話,這就很消耗性能了。

前面的筆記里面說過在React16.8之前,函數(shù)式組件里你沒辦法初始化并使用狀態(tài)(state),在React16.8之后,useState就很好的解決了這個(gè)問題,它可以讓你在函數(shù)式組件里面使用state。

簡單地說,你就把它當(dāng)做函數(shù)組件里的setState來用就行了 基本用法:

用法很簡單,代碼如下:

圖片圖片

如上所示,你只需要useState傳入一個(gè)初始值,然后它返回一個(gè)數(shù)組,數(shù)組第一個(gè)變量是state,數(shù)組第二個(gè)變量就是類似setState的方法 我自己整理了一些使用useState需要注意的地方,可能你也需要。

注意點(diǎn)

初始值傳入方法

這個(gè)問題是有次在我的技術(shù)群里粉絲問到的,大概就是在公司的歷史代碼里看到useState初始化的時(shí)候傳入了一個(gè)function,感覺到這種用法很少見,后來我查閱了文檔,發(fā)現(xiàn)這個(gè)確實(shí)很有意思。

先看看這個(gè)官方例子:

圖片圖片

上面這個(gè)例子中,state的初始化我們是使用createInitialTodos這個(gè)方法來完成的。

看下控制臺(tái),你會(huì)發(fā)現(xiàn)有個(gè)問題,每次todolist組件重新渲染的時(shí)候,createInitialTodos方法都會(huì)重新運(yùn)行一次,但是,只有第一次的返回結(jié)果被useState使用,如果createInitialTodos在做非常耗時(shí)的計(jì)算的話,這就很消耗性能了。

所以,這里需要注意的是如果使用方法來初始化state,直接把它自身傳進(jìn)去就行了,不用運(yùn)行它,也就是下面這樣寫代碼:

圖片

基于最新的state來改變state

這個(gè)問題在類組件的setState中也比較常見,直接看代碼:

圖片

上面這個(gè)例子,你以為調(diào)用了setAge三次,它就會(huì)從0加到3,那就大錯(cuò)特錯(cuò)了。

事實(shí)上,state這個(gè)東西你可以把它理解為一個(gè)快照(snapshot),你更新了它,但是它只會(huì)在下次render的時(shí)候才改變,也就是說你這樣連著調(diào)用三次setAge(age+1),每次取得都是當(dāng)前render中的快照,相當(dāng)于每次都是setAge(42+1),所以,最終結(jié)果是43,并不是45。

那么如果我就想基于最新的state來改變state,代碼可以這樣寫:

圖片

也就是給setAge傳入方法,這個(gè)方法接受上一個(gè)狀態(tài),返回新的狀態(tài)。

連續(xù)傳入三次方法,這三個(gè)方法就會(huì)進(jìn)入隊(duì)列中并且依次執(zhí)行,執(zhí)行完畢之后得到45,最后就拿著45去更新age。

這個(gè)在官方文檔里面也叫做批量更新state,都是使用給狀態(tài)更新方法傳入回調(diào)來實(shí)現(xiàn)的。

責(zé)任編輯:武曉燕 來源: 程序員耳東
相關(guān)推薦

2021-08-13 05:47:48

通信設(shè)計(jì)院通信行業(yè)設(shè)計(jì)院

2019-05-20 15:44:11

盒裝智商稅CPU

2023-04-10 07:26:28

UseStateUseReducer

2022-03-09 12:26:04

MySQL高可用性主備延遲

2022-09-26 07:08:16

無線通信CT

2020-02-15 15:02:44

產(chǎn)品技術(shù)設(shè)計(jì)團(tuán)隊(duì)

2024-09-10 12:15:24

2024-04-18 08:38:15

LLM數(shù)據(jù)訓(xùn)練模型

2022-11-11 07:51:33

2023-01-06 16:36:09

編程效率語言

2024-03-04 07:37:40

MySQL記錄鎖

2022-10-17 00:27:20

二叉樹數(shù)組索引

2020-06-15 08:51:58

數(shù)據(jù)庫存儲(chǔ)系統(tǒng)

2009-07-03 10:31:57

什么是ServletServlet API

2012-09-24 10:25:42

BI軟件開源軟件

2024-04-03 14:56:12

生成式AI人工智能機(jī)器學(xué)習(xí)

2017-08-14 16:14:57

云原生容器云平臺(tái)

2024-08-26 15:31:55

2024-03-06 11:22:33

架構(gòu)演進(jìn)技巧

2013-11-06 10:03:44

Windows 8.1Windows 8.1
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號