Hook?是 React 16.8 的新增特性土铺。它可以讓你在不編寫 class 的情況下使用 state尸曼,一般搭配函數(shù)式組件使用帆焕。
在React 16.8之前帖旨,函數(shù)式組件只能作為無狀態(tài)組件(只讀組件),即不能進行狀態(tài)管理彬呻。
Hooks簡單舉例:
常用hooks介紹
useState() hooks狀態(tài)鉤子
搭配函數(shù)式組件衣陶,主要是可以進行組件的狀態(tài)管理,好處是不像傳統(tǒng)state需要注意this指向(函數(shù)式組件中沒有this)闸氮。
一般用法 const [ a , setA? ] = useState(初始值)
a表示組件需要聲明的變量a剪况,setA允許你在組件其它的位置對a的數(shù)據(jù)進行改變setA(2),即a的值將為2
一個組件中可以聲明多個useState()
useEffect()hooks副作用鉤子
uesEffect()可以與class組件中的三個周期函數(shù)作用相同蒲跨,可以把?useEffect?Hook 看做?componentDidMount译断,componentDidUpdate?和?componentWillUnmount?這三個函數(shù)的組合。
我們運行代碼發(fā)現(xiàn)或悲,title的You clicked ${count} times count有初始值隨著點擊值增加孙咪,即如果要在class組件中實現(xiàn)的話則需要2個周期函數(shù)componentDidMount和componentDidUpdate
默認情況下,它在第一次渲染之后和每次更新之后都會執(zhí)行巡语。
與?componentDidMount?或?componentDidUpdate?不同翎蹈,使用?useEffect?調(diào)度的 effect 不會阻塞瀏覽器更新屏幕,這讓你的應(yīng)用看起來響應(yīng)更快男公。
如何控制useEffect()
? useEffect(() => {?});荤堪,當為此形式時,相當于componentDidMount和componentDidUpdate理澎,即相關(guān)數(shù)據(jù)每一次更新刷新界面都將調(diào)用useEffect()逞力,?useEffect(() => {?}曙寡,[ ]);為此形式時糠爬,相當于componentDidMount,只在頁面掛載時執(zhí)行一次举庶,相關(guān)數(shù)據(jù)改變時不重新調(diào)用useEffect()执隧;?useEffect(() => {?},[ count ]);相當于componentDidMount和componentDidUpdate,但是注意這里只會在count變化時重新調(diào)用useEffect()镀琉;
useEffect(() => {?
?需要在組件銷毀時清除的數(shù)據(jù)或者方法等 峦嗤;
return function clearn({
需要在組件銷毀時清除的數(shù)據(jù)或者方法等
})? },);
此時相當于componentDidMount和componentDidUpdate和componentDidUnmount
其他的Hook(具體參考react hooks官方文檔屋摔,這里簡單介紹一下作用及用法)
useContext()? 獲取context 對象? 用法:const value = useContext(MyContext);
useCallback() 緩存回調(diào)函數(shù)烁设,避免傳入的回調(diào)每次都是新的函數(shù)實例化而導致依賴組件重新渲染;用法:const memoizedCallback = useCallback(()=>{doSomething(a,b);},[a,b],);把內(nèi)聯(lián)回調(diào)函數(shù)及依賴項數(shù)組作為參數(shù)傳入?useCallback钓试,它將返回該回調(diào)函數(shù)的 memoized 版本装黑,該回調(diào)函數(shù)僅在某個依賴項改變時才會更新;
useMemo()緩存每次傳入的props弓熏,避免依賴的組件每次都重新渲染恋谭;用法:const memoizedValue = useMemo (()=>computeExpensiveValue(a,b),[a,b]);把“創(chuàng)建”函數(shù)和依賴項數(shù)組作為參數(shù)傳入?useMemo,它僅會在某個依賴項改變時才重新計算 memoized 值挽鞠。
useRef() 返回一個可變的 ref 對象疚颊,獲取組件的真實節(jié)點;用法:const refContainer = useRef(initialValue);
自定義 Hook(詳細參考react hooks官方文檔)
提取自定義 Hook
當我們想在兩個函數(shù)之間共享邏輯時信认,我們會把它提取到第三個函數(shù)中材义。而組件和 Hook 都是函數(shù),所以也同樣適用這種方式嫁赏。
自定義 Hook 是一個函數(shù)母截,其名稱以 “use” 開頭,函數(shù)內(nèi)部可以調(diào)用其他的 Hook橄教。?