初識(shí)React Hook

作為一個(gè)用慣了Class俭厚、用慣了生命周期開發(fā)的前端老鳥,接觸到React Hook的心情是這樣的


image.png

真的有趣又神奇驶臊!
而且挪挤,它還很簡(jiǎn)單。有了它关翎,我們可以省略很多的代碼扛门,簡(jiǎn)化很多的邏輯,給我的感覺纵寝,它就是一個(gè)帶有狀態(tài)生命周期的加強(qiáng)版的公共方法论寨。當(dāng)然這是個(gè)人感覺,我們還需要知道官方給它的定義爽茴,即

Hook 是 React 16.8 的新增特性葬凳。它可以讓你在不編寫 class 的情況下使用 state 以及其他的 React 特性。

一室奏、組件類的缺陷

關(guān)于組件類的缺陷火焰,官網(wǎng)已明確給出3個(gè),即

  1. 組件之間復(fù)用狀態(tài)邏輯很難
  2. 復(fù)雜組件變得難以理解
  3. 難以理解的class

當(dāng)然胧沫,這樣太抽象昌简,我們看一個(gè)具體的例子,來直觀地感受一下它的好琳袄。
如果我們需要寫一個(gè)計(jì)數(shù)器的組件類江场,原先我們會(huì)這樣寫

import React from 'react'
class Example extends React.Component {
    constructor(props) {
      super(props);
      this.state = {
        count: 0
      };
    }
  
    render() {
      return (
        <div>
          <p>You clicked {this.state.count} times</p>
          <button onClick={() => this.setState({ count: this.state.count + 1 })}>
            Click me
          </button>
        </div>
      );
    }
  }
  export default Example

而現(xiàn)在我們只需要這樣寫

import React, { useState } from 'react';

function Example() {
  // 聲明一個(gè)叫 "count" 的 state 變量
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
export default Example

哇哦,如此簡(jiǎn)單窖逗。這還只是一個(gè)極其簡(jiǎn)單的組件址否,如果是一個(gè)比較復(fù)雜的組件,可想而知,我們會(huì)精簡(jiǎn)多少代碼佑附,就好像一個(gè)負(fù)重前行的人樊诺,扔掉了一堆無用的東西,開始輕裝簡(jiǎn)行音同,走得更快词爬,更瀟灑了。
so,這么好的東西权均,就讓我們見識(shí)一下它的具體用法吧顿膨。

二、常用鉤子

  • useState()
  • useEffect()

以上叽赊,是我們最常用的鉤子恋沃,下面我們來一一介紹

三、 useState() 狀態(tài)鉤子

還是計(jì)數(shù)器的例子

import React, { useState } from 'react';

function Example() {
  // 聲明一個(gè)叫 "count" 的 state 變量
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
export default Example

做了什么: 可以看到必指,useState為我們定義了一個(gè)叫做count的'state變量'囊咏。
參數(shù): useState的唯一參數(shù),就是初始state塔橡。不同于 class 的是梅割,我們可以按照需要使用數(shù)字或字符串對(duì)其進(jìn)行賦值,而不一定是對(duì)象葛家。
返回值: 當(dāng)前 state 以及更新 state 的函數(shù)户辞。
如果,你想定義多個(gè)state惦银,那就多次使用useState就可以了咆课,就像這樣

  const [age, setAge] = useState(42);
  const [fruit, setFruit] = useState('banana');
  const [todos, setTodos] = useState([{ text: '學(xué)習(xí) Hook' }]);

四、 useEffect() 副作用鉤子

ok扯俱,現(xiàn)在我們可以使用state,然后书蚪,不可避免地,我們還需要做一些其他操作迅栅,比如更改dom,發(fā)送網(wǎng)絡(luò)請(qǐng)求等殊校,這樣我們?cè)撊绾巫瞿兀?/p>

import React, { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);

  // Similar to componentDidMount and componentDidUpdate:
  useEffect(() => {
    // Update the document title using the browser API
    document.title = `You clicked ${count} times`;
  });

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
export default Example

像這樣,我們將dom操作放進(jìn)useEffect鉤子里读存,就可以了为流。我們?nèi)匀粡娜齻€(gè)方面來剖析一下
做了什么:通過使用這個(gè) Hook,你可以告訴 React 組件需要在渲染后執(zhí)行某些操作让簿。React 會(huì)保存你傳遞的函數(shù)(我們將它稱之為 “effect”)敬察,并且在執(zhí)行 DOM 更新之后調(diào)用它。

為什么在組件內(nèi)部調(diào)用 useEffect尔当?:將 useEffect 放在組件內(nèi)部讓我們可以在 effect 中直接訪問 count state 變量(或其他 props)莲祸。我們不需要特殊的 API 來讀取它 —— 它已經(jīng)保存在函數(shù)作用域中。Hook 使用了 JavaScript 的閉包機(jī)制,而不用在 JavaScript 已經(jīng)提供了解決方案的情況下锐帜,還引入特定的 React API田盈。

useEffect 會(huì)在每次渲染后都執(zhí)行嗎?: 是的缴阎,默認(rèn)情況下允瞧,它在第一次渲染之后和每次更新之后都會(huì)執(zhí)行。

ok,學(xué)習(xí)到這里蛮拔,希望大家應(yīng)該對(duì)React Hook有了初步的印象述暂,你可以把他拆分成兩部分 狀態(tài) + 副作用(代碼邏輯) 去理解。

既然是初識(shí)建炫,就求個(gè)簡(jiǎn)單明了贸典。有機(jī)會(huì)再給大家?guī)鞨ook的更多玩法啦~~~

參考:

React官方文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市踱卵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌据过,老刑警劉巖惋砂,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绳锅,居然都是意外死亡西饵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門鳞芙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眷柔,“玉大人,你說我怎么就攤上這事原朝⊙敝觯” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵喳坠,是天一觀的道長(zhǎng)鞠评。 經(jīng)常有香客問我,道長(zhǎng)壕鹉,這世上最難降的妖魔是什么剃幌? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮晾浴,結(jié)果婚禮上负乡,老公的妹妹穿的比我還像新娘。我一直安慰自己脊凰,他們只是感情好抖棘,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般钉答。 火紅的嫁衣襯著肌膚如雪础芍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天数尿,我揣著相機(jī)與錄音仑性,去河邊找鬼。 笑死右蹦,一個(gè)胖子當(dāng)著我的面吹牛诊杆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播何陆,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼晨汹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了贷盲?” 一聲冷哼從身側(cè)響起淘这,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巩剖,沒想到半個(gè)月后铝穷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡佳魔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年曙聂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞠鲜。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宁脊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贤姆,到底是詐尸還是另有隱情榆苞,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布霞捡,位于F島的核電站语稠,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏弄砍。R本人自食惡果不足惜仙畦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望音婶。 院中可真熱鬧慨畸,春花似錦、人聲如沸衣式。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至弱卡,卻和暖如春乃正,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背婶博。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工瓮具, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凡人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓名党,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親挠轴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子传睹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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

  • 主要介紹 useState useEffect useReducer useContext 用法 你還在為...
    叫我蘇軾好嗎閱讀 27,395評(píng)論 3 41
  • React是現(xiàn)在最流行的前端框架之一,它的輕量化岸晦,組件化欧啤,單向數(shù)據(jù)流等特性把前端引入了一個(gè)新的高度,現(xiàn)在它又引入的...
    老鼠AI大米_Java全棧閱讀 5,774評(píng)論 0 26
  • 你還在為該使用無狀態(tài)組件(Function)還是有狀態(tài)組件(Class)而煩惱嗎启上?——擁有了hooks堂油,你再也不需...
    米亞流年閱讀 940評(píng)論 0 5
  • 你還在為該使用無狀態(tài)組件(Function)還是有狀態(tài)組件(Class)而煩惱嗎?——擁有了hooks碧绞,你再也不需...
    水落斜陽閱讀 82,316評(píng)論 11 100
  • 生命周期 現(xiàn)在流行的前端框架,無論是angular還是React吱窝,又或是Angular2以及以上讥邻,都由框架自身提供...
    賀賀v5閱讀 5,036評(píng)論 1 2