React的Hook讓函數(shù)組件擁有class組件的特性!

一栅葡、解決了什么問題茉兰?

Hook 是以 use 開頭的特殊函數(shù)(useState、useEffect等)欣簇,只能在 函數(shù)組件 內(nèi)部使用规脸。它可以讓你在不編寫 class 的情況下使用 state 以及其他的 React 特性。譬如 useState 就等同于 class組件中的state對象熊咽。

1莫鸭、庫的更新說明

Hook是React 16.8 新增特性, 在以下模塊中包含了 React Hook 的穩(wěn)定實現(xiàn):

React DOM
React Native
React DOM Server
React Test Renderer
React Shallow Renderer

React Native 0.59 及以上版本支持 Hook横殴。

請注意被因,要啟用 Hook,所有 React 相關(guān)的 package 都必須升級到 16.8.0 或更高版本衫仑。如果你忘記更新諸如 React DOM 之類的 package梨与,Hook 將無法運(yùn)行。

二文狱、Hook 規(guī)則與插件
1粥鞋、規(guī)則
  • Hook只能用在React 的函數(shù)組件自定義Hook中。
  • Hook只能在函數(shù)最外層調(diào)用 瞄崇,在循環(huán)呻粹、條件判斷或者子函數(shù)中調(diào)用都是不允許的。
2苏研、插件

eslint-plugin-react-hooks 用于檢查Hook代碼是否符合規(guī)則的插件等浊。

npm install eslint-plugin-react-hooks
3、插件鏈接:

我們推薦啟用 eslint-plugin-react-hooks 中的 exhaustive-deps 規(guī)則楣富。此規(guī)則會在添加錯誤依賴時發(fā)出警告并給出修復(fù)建議凿掂。


三伴榔、State Hook

State Hook 就是指 useState 這個特殊函數(shù)纹蝴,讓你不用編寫class庄萎,就可以使用state特性,換言之就是讓 函數(shù)組件 擁有 state 特性塘安。詳細(xì)用法糠涛,看這里!


四兼犯、Effect Hook

Effect Hook 就是指 useEffect 這個特殊函數(shù)忍捡,它讓 函數(shù)組件 能在組件渲染完成后執(zhí)行自定義操作。詳細(xì)用法切黔,看這里砸脊!


五、自定義Hook

自定義 Hook 是一個以 use 開頭的自定義函數(shù)纬霞,其內(nèi)部可以調(diào)用 Hook凌埂。

1、自定義Hook
import { useState, useEffect } from 'react';

function useFriendStatus(friendID) {
    const [isOnline, setIsOnline] = useState(null);

    useEffect(() => {
        function handleStatusChange(status) {
            setIsOnline(status.isOnline);
        }

        ChatAPI.subscribeToFriendStatus(friendID, handleStatusChange);
        return () => {
            ChatAPI.unsubscribeFromFriendStatus(friendID, handleStatusChange);
        };
    });

    return isOnline;
}
2诗芜、使用自定義Hook
const friendList = [
    { id: 1, name: 'Phoebe' },
    { id: 2, name: 'Rachel' },
    { id: 3, name: 'Ross' },
];

function ChatRecipientPicker() {
    const [recipientID, setRecipientID] = useState(1);
    const isRecipientOnline = useFriendStatus(recipientID);

    return (
        <>
            <Circle color={isRecipientOnline ? 'green' : 'red'} />
            <select
                value={recipientID}
                onChange={e => setRecipientID(Number(e.target.value))}
            >
                {friendList.map(friend => (
                    <option key={friend.id} value={friend.id}>
                        {friend.name}
                    </option>
                ))}
            </select>
        </>
    );
}

六瞳抓、Context Hook

Context Hook 就是指 useContext 這個特殊函數(shù),解決了 props 在特殊場景下傳遞數(shù)據(jù)的煩惱伏恐。詳細(xì)用法孩哑,看這里!


七翠桦、useReducer

useReducer 是 useState 的升級版本横蜒,對 setState 這個操作進(jìn)行了拆分,可以根據(jù)不同類型秤掌,進(jìn)行不同的邏輯計算愁铺,最后去改變 state 對象。詳細(xì)用法闻鉴,看這里茵乱!


八、useLayoutEffect

useLayoutEffect 的使用與 useEffect 一樣孟岛,只是被調(diào)用的時間點不同瓶竭。useEffect 是在瀏覽器繪制完成后被調(diào)用,useLayoutEffect 在瀏覽器繪制前被調(diào)用渠羞。


九斤贰、useDebugValue

在 React 開發(fā)者工具中顯示自定義 hook 的標(biāo)簽。

function useFriendStatus(friendID) {
    const [isOnline, setIsOnline] = useState(null);

    // 在開發(fā)者工具中的這個 Hook 旁邊顯示標(biāo)簽
    // e.g. "FriendStatus: Online"
    useDebugValue(isOnline ? 'Online' : 'Offline');

    return isOnline;
}

// 第二個參數(shù)可以增加調(diào)試輸出信息
useDebugValue(date, date => date.toDateString());

十次询、useCallback

設(shè)置一個回調(diào)函數(shù)荧恍,只有當(dāng)依賴項的數(shù)值改變時,回調(diào)函數(shù)才被調(diào)用。如下送巡,只有依賴項數(shù)組 [a,b] 有變動時摹菠,才會調(diào)用箭頭函數(shù)。性能優(yōu)化時骗爆,去除一些非必要的組件渲染次氨。

const memoizedCallback = useCallback(
    () => {
        doSomething(a, b);
    },
    [a, b],
);

【備注】 useCallback(fn, deps) 相當(dāng)于 useMemo(() => fn, deps)


十一摘投、useMemo

把箭頭函數(shù) 和 數(shù)組[a,b]煮寡,作為參數(shù)傳遞給 useMemo ,當(dāng)數(shù)組 [a,b] 的數(shù)值發(fā)生改變后犀呼,會在渲染期間調(diào)用箭頭函數(shù)幸撕。如果沒有第二個參數(shù)[a,b],那么每次渲染期間都會調(diào)用箭頭函數(shù)外臂。

先編寫在沒有 useMemo 的情況下也可以執(zhí)行的代碼 —— 之后再在你的代碼中添加 useMemo杈帐,以達(dá)到優(yōu)化性能的目的。

const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);

【備注】 useCallback(fn, deps) 相當(dāng)于 useMemo(() => fn, deps)专钉。

React.memo 等效于 PureComponent挑童,但它只比較 props。(你也可以通過第二個參數(shù)指定一個自定義的比較函數(shù)來比較新舊 props跃须。如果函數(shù)返回 true站叼,就會跳過更新。)

React.memo 不比較 state菇民,因為沒有單一的 state 對象可供比較尽楔。但你也可以讓子節(jié)點變?yōu)榧兘M件。


十二第练、useImperativeHandle
// 把自己暴露給父組件阔馋,供父組件操作訪問自己內(nèi)部。
useImperativeHandle(ref, createHandle, [deps])

useImperativeHandle 應(yīng)當(dāng)與 forwardRef 一起使用:

// input 把自己暴露給父組件娇掏,父組件就可以調(diào)用其 focus 方法呕寝。
function FancyInput(props, ref) {
    const inputRef = useRef();
    useImperativeHandle(ref, () => ({
        focus: () => {
            inputRef.current.focus();
        }
    }));
    return <input ref={inputRef} ... />;
}
FancyInput = forwardRef(FancyInput);
渲染 <FancyInput ref={inputRef} /> 的父組件可以調(diào)用 inputRef.current.focus()。

十婴梧、相關(guān)鏈接:
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市塞蹭,隨后出現(xiàn)的幾起案子孽江,更是在濱河造成了極大的恐慌,老刑警劉巖番电,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岗屏,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)这刷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門涎跨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人崭歧,你說我怎么就攤上這事∽怖危” “怎么了率碾?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屋彪。 經(jīng)常有香客問我所宰,道長,這世上最難降的妖魔是什么畜挥? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任仔粥,我火速辦了婚禮,結(jié)果婚禮上蟹但,老公的妹妹穿的比我還像新娘躯泰。我一直安慰自己,他們只是感情好华糖,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布麦向。 她就那樣靜靜地躺著,像睡著了一般客叉。 火紅的嫁衣襯著肌膚如雪诵竭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天兼搏,我揣著相機(jī)與錄音卵慰,去河邊找鬼。 笑死佛呻,一個胖子當(dāng)著我的面吹牛裳朋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吓著,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼再扭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了夜矗?” 一聲冷哼從身側(cè)響起泛范,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎紊撕,沒想到半個月后罢荡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年区赵,在試婚紗的時候發(fā)現(xiàn)自己被綠了惭缰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡笼才,死狀恐怖漱受,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情骡送,我是刑警寧澤昂羡,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站摔踱,受9級特大地震影響虐先,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜派敷,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一蛹批、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篮愉,春花似錦腐芍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冗酿,卻和暖如春埠对,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背裁替。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工项玛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弱判。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓襟沮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昌腰。 傳聞我的和親對象是個殘疾皇子开伏,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 課程目標(biāo) 掌握函數(shù)組件的創(chuàng)建與使用; 掌握 React 常見 Hooks 使用遭商; 掌握如何自定義 Hook固灵。 課程...
    magic_pill閱讀 319評論 0 0
  • 1、值捕獲 造成數(shù)據(jù)不一致 異常 閉包內(nèi)部變量為值捕獲劫流。如例子巫玻,點擊按鈕丛忆,設(shè)置age為1,調(diào)用request方法仍秤,...
    請叫我啊亮閱讀 10,790評論 0 0
  • github的MD[https://github.com/liusanhong/study/blob/master...
    半個木頭人閱讀 276評論 0 0
  • 1 關(guān)于hook 1.1 為什么使用hook 在react類組件(class)寫法中熄诡,有setState和生命周期...
    江湖yi山人閱讀 1,849評論 0 3
  • 一、組件類 React的核心是組件, 在v16.8之前,組件的標(biāo)準(zhǔn)寫法是類(class)诗力。 以下為一個簡單的組件類...
    郭_小青閱讀 710評論 1 5