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