摘要:此優化有助于避免在每個渲染上進行昂貴的計算。同樣也是一個函數,接受兩個參數,第一個參數為函數,第二個參數為要比對的值,返回一個值。同理,第二個參數傳入的值沒有更新時,不會執行。以上代碼的地址為初體驗
什么是Hooks?
Hooks是react即將推出的功能,它允許您在不編寫類的情況下使用狀態和其他React功能。
我的理解就是可以用寫無狀態組件的方式去編寫擁有狀態的組件。
遺憾的是,正式版16.7.0出了之后并沒有hooks,如果需要體驗還需下載next版本,目前是16.7.0-alpha.2
npm i react@next 這次與大家分享四個Hooks,個人覺得這幾個應該是之后工作中會經常使用到的。 1. useState 2. useEffect 3. useReducer 4. useMemo
1.useState
個人感覺這個鉤子是重點,使用它即可做到用函數的編寫帶有狀態的組件。
import React,{ useState,useEffect } from "react" const HookTest = () => { const [obj,setValue] = useState({key:"count",value:0}); const handleChange = () => { const value = obj.value+1; //改變狀態 setValue(Object.assign(obj,{value})); } return ({obj.key}:{obj.value}) }
很明顯,重點在于const [obj,setValue] = useState({key:"count",value:0})這一句,useState是個函數,接收一個狀默認值,返回一個數組,第一個元素為狀態,初始值為傳入函數的默認值,第二個元素為方法,可使用此方法改變狀態的值。
2.useEffect
這個鉤子,官方所說是componentDidMount,componentDidUpdate和componentWillUnmount這三個生命周期的結合,因為組件掛載完成時會執行,更新時會執行,卸載時會執行,接上面的HookTest組件,往里添加
useEffect(()=>{ console.log("obj->",obj); return ()=>{ console.log("卸載時.."); } });
這就是一個基本用法,掛載、更新、卸載都會打印obj對象,return的函數,作為組件更新或者卸載時執行,比如在使用setinterval,可以在return的函數里寫clearinterval。
如果只想讓它執行一次的話,可以往函數里添加第二個參數。
useEffect(()=>{ console.log("obj->",obj); },false);
這樣只在掛載完成時執行一次,第二個參數可以為false、[]、{}、""
如果想讓他有條件的執行,可以往第二個參數傳入具體的參數
useEffect(()=>{ console.log("obj->",obj); },{obj.value});
如果obj.value值變化時,就執行,沒變化時就不執行,對于性能優化非常友好。
3.useReducer
如果使用過redux的童鞋們不會默認,將需要的狀態保存到一個對象中,可供所有的組件使用。
先上代碼
import React, { useReducer,useMemo,useEffect,useState } from "react"; //創建reducer,reducer可在外部創建然后再引入 function reducer(state = { count: 0 }, action) { switch (action.type) { case "reset": return { count: 0 }; case "increment": return { count: state.count + 1 }; case "decrement": return { count: state.count <= 0 ? 0 : state.count - 1 }; default: return state; } } //組件 const useReducerDemo = () => { const [state, dispatch] = useReducer(reducer, { count: 0 }, { type: "increment" }); //異步增加 const asyncIncrement = () => { setTimeout(()=>{ dispatch({ type: "increment" }) },2000); } return () }Count: {state.count}
可以看到,和useState很像,也是使用一個數組解構接受返回的值。
先說返回的值:
1.state
自然為reducer的狀態
2.dispatch
這個是一個函數,有dispatch就意味著我們可以不用像使用redux時還需要自己下中間件(如redux-thunk)就可以進行異步操作,具體看asyncIncrement函數,參數為一個對象,指定需要執行的action
再說useReducer函數的參數:
第一個參數為你引入的reducer,第二個參數為state的默認值,第三個參數為初始觸發的action,就是載入時默認就執行一個action
4.useMemo
useMemo只有當其中一個輸入發生變化時,才會重新計算記憶值。此優化有助于避免在每個渲染上進行昂貴的計算。
此鉤子也是有助于性能優化,接入上面的useReducerDemo組件,往里添加
const [tips,setTips] = useState(false); //當為0時提示不能再減了 useEffect(()=>{ if(!state.count){ setTips(true); }else{ setTips(false); } }); const memoizedValue = useMemo(() => { console.log("useMemo run"); return tips }, [tips]);
在return組件元素div里添加
{ memoizedValue &&不能為負數哦
}
以上新增的代碼時為了實現在reducer里的count小于等于0或從0變更為其他數字時更新true或false,以此達到p元素的顯示與否,否則一直為上一次計算得到值,我們使用了console.log("useMemo run");記錄它更新的次數,當count從0一直+1,只會打印一次"useMemo run",由此說明,只在0變成1的時候執行了一次,往后memoizedValue的值一直為0變成1時所return的值。
此例子并說明不了什么,不過當有很龐大計算量的時候就能體現出useMemo的作用了。
useMemo同樣也是一個函數,接受兩個參數,第一個參數為函數,第二個參數為要比對的值,返回一個值。
第二個參數里可以傳入多個值,如[a,b,c,...],當傳入的這些值有變化時,就會去執行第一個傳入的函數,根據業務需求計算后返回最終結果。
同理,第二個參數傳入的值沒有更新時,不會執行。
結尾
花了一下午的時間體驗hook,其他的鉤子也使用了個遍,感覺這四個在我看來和在我公司業務里可能會大量的使用到,所以發此文章分享,也為記錄,本人新手前端一枚,第一次寫文章,有說的不對的地方還請請多多指教。
謝謝大家的閱讀。
以上代碼的github地址為react-hooks初體驗
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/100326.html
摘要:對于,唯一可以指向的兩個行為是增加容器的數量和減少容器的數量。使用在超出范圍內對服務進行伸縮是不允許的。沒有身份認證或實物需要通過請求發送到。 Rancher 1.4已于上周全面發布!新版本帶來了Dashboard和Helm的集成,更細致的網絡策略控制,直接構建進平臺中的保密管理,當然還有今天要重點介紹的主角,Webhooks! Rancher 1.4版本為webhooks添加了一個新...
摘要:去年年初寫了一個擴展十閱后,一直想寫個十閱出來,奈何懶癌后期,一直拖到最近才完成原型。這次心血來潮閑的蛋疼,想起去年年初就有所耳聞的,于是就打算用它來耍耍。使用鏈接庫在設備上運行用來斷點調試地址學習資源圖圖圖 去年年初寫了一個 chrome 擴展「十閱」后,一直想寫個十閱 app 出來,奈何懶癌后期,一直拖到最近才完成原型。 其實很早之前就已經寫過一個 hybrid app 了,使用了...
摘要:為什么選擇是開發和維護的一種面向對象的編程語言。一在組件組件復用狀態邏輯很難沒有提供將可復用性行為附加到組件的途徑例如,把組件連接到。如此很容易產生,并且導致邏輯不一致。同時,這也是很多人將與狀態管理庫結合使用的原因之一。 前端時間,接觸了hooks,研究了一段時間后感覺使用起來十分方便,正好公司開了一個新的小項目,正好使用hooks來實踐一下。 技術選型 1.為什么選擇umi 在之前...
閱讀 3732·2021-11-24 10:23
閱讀 2777·2021-09-06 15:02
閱讀 1280·2021-08-23 09:43
閱讀 2358·2019-08-30 15:44
閱讀 3052·2019-08-30 13:18
閱讀 786·2019-08-23 16:56
閱讀 1750·2019-08-23 16:10
閱讀 544·2019-08-23 15:08