react hook入門

一缀磕、react hook介紹

Hook 是 React 16.8 的新增特性。它可以讓你在不編寫 class 的情況下使用 state 以及其他的 React 特性。目的是解決React的狀態(tài)邏輯復(fù)用問題,因?yàn)镽eact Hooks只共享數(shù)據(jù)處理邏輯芙盘,并不會(huì)共享數(shù)據(jù)本身。

在React應(yīng)用開發(fā)中脸秽,狀態(tài)管理是組件開發(fā)必不可少的內(nèi)容儒老。以前,為了對(duì)狀態(tài)進(jìn)行管理记餐,最通常的做法是使用類組件或者直接使用redux等狀態(tài)管理框架⊥苑現(xiàn)在,開發(fā)者可以直接使用React Hooks提供的State Hook來處理狀態(tài)片酝。

眾所周知囚衔,React提供了兩種創(chuàng)建組件的方式,即函數(shù)組件和類組件雕沿。函數(shù)組件是一個(gè)普通的JavaScript函數(shù)练湿,接受props對(duì)象并返回React元素,函數(shù)組件更符合React數(shù)據(jù)驅(qū)動(dòng)視圖的開發(fā)思想审轮。不過肥哎,函數(shù)組件缺乏類組件諸如狀態(tài)辽俗、生命周期等種種特性,而Hooks的出現(xiàn)就是讓函數(shù)式組件擁有類組件的特性贤姆。

為了讓函數(shù)組件擁有類組件的諸如狀態(tài)榆苞、生命周期等特性,React 提供了3個(gè)核心的api霞捡,即state hook 、Effect hook以及自定義 hook薄疚。

二碧信、react hook的使用方法

import React, { useState } form 'react';

function Example() {

????// useState 方法返回一個(gè)數(shù)組街夭。第一個(gè)值是當(dāng)前的 state砰碴,第二個(gè)值是更新 state 的函數(shù),相當(dāng)于類組件的setState板丽。

? ? const [count, setCount] = useState(0);

? ? return (

? ? ????<div>

? ? ? ??????<p>You clicked {count} times</p>

? ? ? ??????<button onClick={() => setCount(count + 1)}>點(diǎn)我加1</button>

? ? ????</div>

? );

}

如上示例呈枉,這個(gè)函數(shù)組件有自己的狀態(tài),并且還可以更新自己的狀態(tài)埃碱。useState用于創(chuàng)建一個(gè)新的狀態(tài)猖辫,參數(shù)為一個(gè)固定的值(初始值,作為useState的參數(shù)來將其初始化為 0)或者一個(gè)有返回值的方法砚殿。執(zhí)行后的結(jié)果為一個(gè)數(shù)組啃憎,分別為生成的狀態(tài)count以及改變?cè)摖顟B(tài)的方法setCount,通過解構(gòu)賦值的方法拿到對(duì)應(yīng)的值與方法似炎。

函數(shù)組件中如果存在多個(gè)狀態(tài)辛萍,既可以通過一個(gè)useState聲明對(duì)象類型的狀態(tài),也可以通過useState多次聲明狀態(tài)羡藐。

const [count, setCount] = useState({

? count1: 0,

? count2: 0

});

或者

const [count1, setCount1] = useState(0);

const [count2, setCount2] = useState(0);

三贩毕、Effect hook 的使用方法

Effect Hook 可以在函數(shù)組件中執(zhí)行副作用操作,主要用于以下兩種情況:

1.函數(shù)式組件中不存在傳統(tǒng)類組件生命周期的概念仆嗦,如果我們需要在一些特定的生命周期或者值變化后做一些操作的話辉阶,必須借助useEffect的一些特性去實(shí)現(xiàn)。

2.useState產(chǎn)生的 changeState 方法并沒有提供類似于setState的第二個(gè)參數(shù)一樣的功能欧啤,因此如果需要在 State 改變后執(zhí)行一些方法睛藻,必須通過useEffect實(shí)現(xiàn)。

該鉤子接受兩個(gè)參數(shù)邢隧,第一個(gè)參數(shù)為副作用需要執(zhí)行的回調(diào)店印,生成的回調(diào)方法內(nèi)可以返回一個(gè)函數(shù)(將在組件卸載時(shí)運(yùn)行);第二個(gè)為該副作用監(jiān)聽的狀態(tài)數(shù)組倒慧,當(dāng)對(duì)應(yīng)狀態(tài)發(fā)生變動(dòng)時(shí)會(huì)執(zhí)行副作用按摘,如果第二個(gè)參數(shù)為空包券,那么在每一個(gè) State 變化時(shí)都會(huì)執(zhí)行該副作用。

const?[count,?changeCount]?=?useState(0);

//?將在count變化時(shí)打印最新的count數(shù)據(jù)

useEffect(()=>?{

??message.info(`count發(fā)生變動(dòng)炫贤,最新值為${count}`);

},?[count])

在上面的例子中溅固,我們實(shí)現(xiàn)了利用useState實(shí)現(xiàn)了setState后執(zhí)行某個(gè)方法,那如果想要實(shí)現(xiàn)componentDidMount和componentWillUnmout生命周期的功能呢兰珍?

首先所有的副作用在組件掛載完成后會(huì)執(zhí)行一次 侍郭,如果副作用存在返回函數(shù),那么返回的函數(shù)將在卸載時(shí)運(yùn)行掠河。我們要做的就是讓與該副作用相關(guān)聯(lián)的狀態(tài)為空數(shù)組亮元,不管其他狀態(tài)如何變動(dòng),該副作用都不會(huì)再次執(zhí)行唠摹,于是就實(shí)現(xiàn)了componentDidMount和componentWillUnmout爆捞。

functionChild({?visible?}){

??useEffect(()=>?{

????message.info('我只在頁(yè)面掛載時(shí)打印');

????return?()=>?{

??????message.info('我只在頁(yè)面卸載時(shí)打印');

????};

??},?[]);

??return?visible???'true'?:?'false';

}

在上面示例中,我們實(shí)現(xiàn)了componentDidMount和componentWillUnmout勾拉,那么如何實(shí)現(xiàn)componentDidUpdate呢煮甥?其實(shí),只要第二個(gè)參數(shù)為空(注意不是上面示例中的空數(shù)據(jù)藕赞,而是不傳第二個(gè)參數(shù))成肘,那么在每一個(gè) State 變化時(shí)都會(huì)執(zhí)行該副作用了。

useEffect(()=>?{

?……

})

四找默、如何自定義Hook

眾所周知艇劫,要在類組件之間共享一些狀態(tài)邏輯是非常麻煩的,常規(guī)做法是通過高階組件或函數(shù)的屬性來解決惩激。不過店煞,新版的React允許開發(fā)者創(chuàng)建自定義Hook來封裝共享狀態(tài)邏輯,且不需要向組件樹中增加新的組件风钻。

所謂的自定義Hook顷蟀,其實(shí)就是指函數(shù)名以u(píng)se開頭并調(diào)用其他Hook的函數(shù),自定義Hook的每個(gè)狀態(tài)都是完全獨(dú)立的骡技。

export const useAxios = (url, dependencies) => {

? ? const [isLoading, setIsLoading] = useState(false);

? ? const [response, setResponse] = useState(null);

? ? useEffect(() => {

? ? ? ? setIsLoading(true);

? ? ? ? axios.get(url).then((res) => {

? ? ? ? ? ? setIsLoading(false);

? ? ? ? ? ? setResponse(res);

? ? ? ? }).catch((err) => {

? ? ? ? ? ? setIsLoading(false);

? ? ? ? });

? ? }, dependencies);

? ? return [isLoading, response, error];

};

使用自定義方法:

function Example() {

? let url = 'http://www.baidu.com/api/xxx';

? const [isLoading, response, error] = useAxios(url, []);

? ...

}

export default Example;

五鸣个、使用Hooks的注意事項(xiàng):

1.不要在循環(huán)、條件或嵌套函數(shù)中使用Hook布朦,并且只能在React函數(shù)的頂層使用Hook囤萤。因?yàn)镽eact需要利用調(diào)用順序來正確更新相應(yīng)的狀態(tài),以及調(diào)用相應(yīng)的生命周期函數(shù)函數(shù)是趴。一旦在循環(huán)或條件分支語(yǔ)句中調(diào)用Hook涛舍,就容易導(dǎo)致調(diào)用順序的不一致性,從而產(chǎn)生難以預(yù)料到的后果唆途。

2.只能在React函數(shù)式組件或自定義Hook中使用Hook富雅。


參考鏈接:https://segmentfault.com/a/1190000019438921

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掸驱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子没佑,更是在濱河造成了極大的恐慌毕贼,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛤奢,死亡現(xiàn)場(chǎng)離奇詭異鬼癣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)啤贩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門扣溺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓜晤,你說我怎么就攤上這事「鼓桑” “怎么了痢掠?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嘲恍。 經(jīng)常有香客問我足画,道長(zhǎng),這世上最難降的妖魔是什么佃牛? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任淹辞,我火速辦了婚禮,結(jié)果婚禮上俘侠,老公的妹妹穿的比我還像新娘象缀。我一直安慰自己,他們只是感情好爷速,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布央星。 她就那樣靜靜地躺著,像睡著了一般惫东。 火紅的嫁衣襯著肌膚如雪莉给。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天廉沮,我揣著相機(jī)與錄音颓遏,去河邊找鬼。 笑死滞时,一個(gè)胖子當(dāng)著我的面吹牛叁幢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漂洋,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼遥皂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼力喷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起演训,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤弟孟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后样悟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拂募,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年窟她,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了陈症。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡震糖,死狀恐怖录肯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吊说,我是刑警寧澤论咏,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站颁井,受9級(jí)特大地震影響厅贪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雅宾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一养涮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧眉抬,春花似錦贯吓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至昏苏,卻和暖如春尊沸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贤惯。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工洼专, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人孵构。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓屁商,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親颈墅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜡镶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 主要介紹 useState useEffect useReducer useContext 用法 你還在為...
    叫我蘇軾好嗎閱讀 27,392評(píng)論 3 41
  • Hooks是 React v16.8 的新特性雾袱,可以在不使用類組件的情況下,使用 state 以及其他的React...
    hellomyshadow閱讀 13,420評(píng)論 0 5
  • Hook是React16.8的新增特性官还。它可以讓你在不編寫class的情況下使用state以及其他的react特性...
    逝去丶淺秋閱讀 589評(píng)論 0 2
  • 最新在學(xué)ReactHooks這個(gè)新特性望伦,把學(xué)習(xí)筆記記下來林说,供大家分享。 原先的函數(shù)組件是沒有生命周期函數(shù)的屯伞,這樣在...
    番茄_tomatoMan閱讀 1,735評(píng)論 0 0
  • 自從Hooks出現(xiàn)腿箩,函數(shù)式組件(Function Component)的功能在不斷豐富,你很可能已經(jīng)運(yùn)用Hooks...
    tracyXia閱讀 11,404評(píng)論 2 7