react hooks 是 react 16.8 的新增特性。 它可以讓我們在函式元件中使用 state 、生命週期以及其他 react 特性,而不僅限於 class 元件。react hooks 的出現,標示著 react 中不會在存在無狀態元件了,只有類元件和函式元件。
狀態是隱藏在元件中的資訊,元件可以在父元件不知道的情況下修改其狀態。相比類元件,函式元件足夠簡單,要使函式元件具有狀態管理,可以usestate() hook。
定義乙個state,以及更新 state 的函式。在初始渲染期間,返回的狀態 (state) 與傳入的第乙個引數 (initialstate) 值相同。setstate 函式用於更新 state。它接收乙個新的 state 值並將元件的一次重新渲染加入佇列。在後續的重新渲染中,usestate 返回的第乙個值將始終是更新後最新的 state。
1 const [state, setstate] =usestate(initialstate);2 setstate(newstate);
例子:
1function
2 const [ count, setcount ] = usestate(0)
3return(4
5點選次數:
6}>點我78
)9 }
當我們在使用 usestate 時,修改值時傳入同樣的值,元件不會重新渲染,這點和類元件setstate保持一致。
usestate 支援我們在呼叫的時候直接傳入乙個值,來指定 state 的預設值,比如這樣 usestate(0), usestate(), usestate([ 1, 2 ]),還支援我們傳入乙個函式,來通過邏輯計算出預設值,比如這樣
1function
2 const [ count, setcount ] = usestate(() =>)
5return(6
7點選次數:
8}>點我910
)11 }
usestate 中的函式只會在初始化的時候執行一次。
如果新的 state 需要通過使用先前的 state 計算得出,那麼可以將函式傳遞給 setstate。該函式將接收先前的 state,並返回乙個更新後的值。下面的計數器元件示例展示了 setstate 的兩種用法:
1function
counter()
6function
handleclickfn() )10}
11return(12
<>
13count: 14+
15+1617
);18 }
handleclick和handleclickfn乙個是通過乙個新的 state 值更新,乙個是通過函式式更新返回新的 state。現在這兩種寫法沒有任何區別,但是如果是非同步更新的話,區別就顯現出來了。
1function
counter() , 3000);7}
8function
handleclickfn() )
13 }, 3000);14}
15return(16
<>
17count: 18+
19+2021
);22 }
當設定為非同步更新,點選按鈕延遲到3s之後去呼叫setcount函式,當快速點選按鈕時,也就是說在3s多次去觸發更新,但是只有一次生效,因為 count 的值是沒有變化的。而當使用函式式更新 state 的時候,這種問題就沒有了,因為它可以獲取之前的 state 值,也就是**中的 prevcount 每次都是最新的值。
其實這個特點和類元件中 setstate 類似,可以接收乙個新的 state 值更新,也可以函式式更新。如果新的 state 需要通過使用先前的 state 計算得出,那麼就要使用函式式更新。因為setstate更新可能是非同步,當你在事件繫結中操作 state 的時候,setstate更新就是非同步的。
一般操作state,因為涉及到 state 的狀態合併,react 認為當你在事件繫結中操作 state 是非常頻繁的,所以為了節約效能 react 會把多次 setstate 進行合併為一次,最後在一次性的更新 state,而定時器裡面操作 state 是不會把多次合併為一次更新的。
在 react 應用中,當某個元件的狀態發生變化時,它會以該元件為根,重新渲染整個元件子樹。
1function
child() 5)
6}78
function
9 const [number, setnumber] = usestate(0)
10 const [name, setname] = usestate('hello') //
表單的值
11 const addclick = () => setnumber(number + 1)
12 const data =
13return(14
15setname(e.target.value)} />
161718)
19 }
上述**中,子元件引用了number相關資料,但是當name相關資料發生變化,也會重繪整個元件,子元件雖然沒有任何變化,也會重繪。為了避免不必要的子元件的重渲染,需要使用usememo和usecallback的hook。
1function
child() 5)
6}78 child =memo(child)910
function
11 const [number, setnumber] = usestate(0)
12 const [name, setname] = usestate('hello') //
表單的值
13 const addclick = usecallback(() => setnumber(number + 1), [number])
14 const data = usememo(() =>(), [number])
15return(16
17setname(e.target.value)} />
181920)
21}22
把「建立」函式和依賴項陣列作為引數傳入 usememo,它僅會在某個依賴項改變時才重新計算 memoized 值。這種優化有助於避免在每次渲染時都進行高開銷的計算。如果沒有提供依賴項陣列,usememo 在每次渲染時都會計算新的值。
usecallback返回乙個 memoized **函式。usecallback(fn, deps) 相當於 usememo(() => fn, deps)。
usecallback 和 usememo 引數相同,第乙個引數是函式,第二個引數是依賴項的陣列。主要區別是 react.usememo 將呼叫 fn 函式並返回其結果,而 react.usecallback 將返回 fn 函式而不呼叫它。
React 4 函式式元件
函式式元件中,沒有 state 和 生命週期,所以又被稱為 無狀態元件 在react16.7 beta測試 版本中,函式元件一直當作純渲染元件來使用 1.元件的第0個引數,是props,接收父級傳遞過來的資訊 2.元件中的 return 必須寫 定義該元件要渲染的內容 3.沒有生命週期 只在類式元件...
react父子元件傳值 react元件通訊
react元件之間的通訊,其實就是通過乙個props建立彼此之間的橋梁,而我們最常用的就是父子傳值,子父傳值,以及兄弟之間傳值 1 父元件給子元件傳值 父元件給子元件傳值相對比較簡單,如果想讓他們倆之間有所聯絡,想傳遞父元件的資料,那麼我們就在父級元件中的子元件標籤上定義乙個屬性,而屬性的值就是我們...
React元件傳值
父元件向子元件傳值 通過父元件的props屬性向子元件傳值 子元件 children.js import react,from react export default class children extends component render 父元件 parent.js import reac...