react基礎(chǔ)

以前吆豹,React API 只有一套钠糊,現(xiàn)在有兩套:類(class)API 和基于函數(shù)的鉤子(hooks) API锡凝。
官方[推薦]使用鉤子(函數(shù))粘昨,而不是類。因?yàn)殂^子更簡(jiǎn)潔,代碼量少张肾,用起來(lái)比較"輕"芭析,而類比較"重"。而且吞瞪,鉤子是函數(shù)馁启,更符合 React 函數(shù)式的本質(zhì)。
類(class)是數(shù)據(jù)和邏輯的封裝芍秆。 也就是說(shuō)惯疙,組件的狀態(tài)和操作方法是封裝在一起的。如果選擇了類的寫法妖啥,就應(yīng)該把相關(guān)的數(shù)據(jù)和操作霉颠,都寫在同一個(gè) class 里面。


image.png

函數(shù)一般來(lái)說(shuō)荆虱,只應(yīng)該做一件事蒿偎,就是返回一個(gè)值。 如果你有多個(gè)操作怀读,每個(gè)操作應(yīng)該寫成一個(gè)單獨(dú)的函數(shù)诉位。而且,數(shù)據(jù)的狀態(tài)應(yīng)該與操作方法分離菜枷。根據(jù)這種理念苍糠,React 的函數(shù)組件只應(yīng)該做一件事情:返回組件的 HTML 代碼,而沒(méi)有其他的功能啤誊。因?yàn)檫€有許多狀態(tài)和變量要保存岳瞭,這個(gè)時(shí)候就有了鉤子。

鉤子(hook)的作用

鉤子(hook)就是 React 函數(shù)組件的副效應(yīng)解決方案坷衍,用來(lái)為函數(shù)組件引入副效應(yīng)寝优。 函數(shù)組件的主體只應(yīng)該用來(lái)返回組件的 HTML 代碼,所有的其他操作(副效應(yīng))都必須通過(guò)鉤子引入枫耳。
常用鉤子:
useState():保存狀態(tài)
useContext():保存上下文
useRef():保存引用
useEffect()是通用的副效應(yīng)鉤子

useEffect()的用法


import React, { useEffect } from 'react';

function Welcome(props) {
  useEffect(() => {
    document.title = '加載完成';
  });
  return <h1>Hello, {props.name}</h1>;
}

useEffect()的作用就是指定一個(gè)副效應(yīng)函數(shù),組件每渲染一次孟抗,該函數(shù)就自動(dòng)執(zhí)行一次迁杨。組件首次在網(wǎng)頁(yè) DOM 加載后,副效應(yīng)函數(shù)也會(huì)執(zhí)行凄硼。

有時(shí)候铅协,我們不希望useEffect()每次渲染都執(zhí)行,這時(shí)可以使用它的第二個(gè)參數(shù)摊沉,使用一個(gè)數(shù)組指定副效應(yīng)函數(shù)的依賴項(xiàng)狐史,只有依賴項(xiàng)發(fā)生變化,才會(huì)重新渲染。

function Welcome(props) {
  useEffect(() => {
    document.title = `Hello, ${props.name}`;
  }, [props.name]);
  return <h1>Hello, {props.name}</h1>;
}

如何獲取數(shù)據(jù)

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

function App() {
  const [data, setData] = useState({ hits: [] });

  useEffect(() => {
    const fetchData = async () => {
      const result = await axios(
        'https://hn.algolia.com/api/v1/search?query=redux',
      );

      setData(result.data);
    };

    fetchData();
  }, []);

  return (
    <ul>
      {data.hits.map(item => (
        <li key={item.objectID}>
          <a href={item.url}>{item.title}</a>
        </li>
      ))}
    </ul>
  );
}

export default App;

由于獲取數(shù)據(jù)只需要執(zhí)行一次骏全,所以上例的useEffect()的第二個(gè)參數(shù)為一個(gè)空數(shù)組苍柏。

useEffect() 的返回值

副效應(yīng)是隨著組件加載而發(fā)生的,那么組件卸載時(shí)姜贡,可能需要清理這些副效應(yīng)试吁。
useEffect()允許返回一個(gè)函數(shù),在組件卸載時(shí)楼咳,執(zhí)行該函數(shù)熄捍,清理副效應(yīng)。如果不需要清理副效應(yīng)母怜,useEffect()就不用返回任何值余耽。

useEffect(() => {
  const subscription = props.source.subscribe();
  return () => {
    subscription.unsubscribe();
  };
}, [props.source]);

useEffect() 的注意點(diǎn)

使用useEffect()時(shí),有一點(diǎn)需要注意苹熏。如果有多個(gè)副效應(yīng)宾添,應(yīng)該調(diào)用多個(gè)useEffect(),而不應(yīng)該合并寫在一起柜裸。


function App() {
  const [varA, setVarA] = useState(0);
  const [varB, setVarB] = useState(0);
  useEffect(() => {
    const timeoutA = setTimeout(() => setVarA(varA + 1), 1000);
    const timeoutB = setTimeout(() => setVarB(varB + 2), 2000);

    return () => {
      clearTimeout(timeoutA);
      clearTimeout(timeoutB);
    };
  }, [varA, varB]);

  return <span>{varA}, {varB}</span>;
}

上面的例子是錯(cuò)誤的寫法缕陕,副效應(yīng)函數(shù)里面有兩個(gè)定時(shí)器,它們之間并沒(méi)有關(guān)系疙挺,其實(shí)是兩個(gè)不相關(guān)的副效應(yīng)扛邑,不應(yīng)該寫在一起。正確的寫法是將它們分開寫成兩個(gè)useEffect()铐然。

function App() {
  const [varA, setVarA] = useState(0);
  const [varB, setVarB] = useState(0);

  useEffect(() => {
    const timeout = setTimeout(() => setVarA(varA + 1), 1000);
    return () => clearTimeout(timeout);
  }, [varA]);

  useEffect(() => {
    const timeout = setTimeout(() => setVarB(varB + 2), 2000);

    return () => clearTimeout(timeout);
  }, [varB]);

  return <span>{varA}, {varB}</span>;
}

文章來(lái)源阮一峰老師的一篇文章
https://www.ruanyifeng.com/blog/2020/09/react-hooks-useeffect-tutorial.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔬崩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子搀暑,更是在濱河造成了極大的恐慌沥阳,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件自点,死亡現(xiàn)場(chǎng)離奇詭異桐罕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)桂敛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門功炮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人术唬,你說(shuō)我怎么就攤上這事薪伏。” “怎么了粗仓?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵嫁怀,是天一觀的道長(zhǎng)设捐。 經(jīng)常有香客問(wèn)我,道長(zhǎng)塘淑,這世上最難降的妖魔是什么萝招? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮朴爬,結(jié)果婚禮上即寒,老公的妹妹穿的比我還像新娘恩脂。我一直安慰自己歹篓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布授药。 她就那樣靜靜地躺著具滴,像睡著了一般凹嘲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上构韵,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天周蹭,我揣著相機(jī)與錄音,去河邊找鬼疲恢。 笑死凶朗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的显拳。 我是一名探鬼主播棚愤,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杂数!你這毒婦竟也來(lái)了宛畦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揍移,失蹤者是張志新(化名)和其女友劉穎次和,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體那伐,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡踏施,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喧锦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片读规。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖燃少,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铃在,我是刑警寧澤阵具,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布碍遍,位于F島的核電站,受9級(jí)特大地震影響阳液,放射性物質(zhì)發(fā)生泄漏怕敬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一帘皿、第九天 我趴在偏房一處隱蔽的房頂上張望东跪。 院中可真熱鬧,春花似錦鹰溜、人聲如沸虽填。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)斋日。三九已至,卻和暖如春墓陈,著一層夾襖步出監(jiān)牢的瞬間恶守,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工贡必, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兔港,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓仔拟,卻偏偏與公主長(zhǎng)得像衫樊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子理逊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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

  • useState 值為數(shù)字的時(shí)候 值為對(duì)象數(shù)組的時(shí)候橡伞,返回的必須是新的對(duì)象 值為數(shù)組的時(shí)候,返回的必須是新的數(shù)組)...
    ticktackkk閱讀 269評(píng)論 0 0
  • 一晋被、props 1兑徘、什么是props? 定義:props是父子組件之間通信的紐帶羡洛,它表示的是父組件傳遞過(guò)來(lái)的自定義...
    MonkeyCode閱讀 464評(píng)論 0 0
  • 1, 函數(shù)化組件HOOK Hook 是一個(gè)特殊的函數(shù)挂脑,它可以讓你“鉤入” React 的特性。例如欲侮,useStat...
    城南boy閱讀 720評(píng)論 0 0
  • React崭闲,用于構(gòu)建用戶界面的 JavaScript 庫(kù),是Facebook公司的開源項(xiàng)目威蕉,用于開發(fā)單頁(yè)面應(yīng)用刁俭; ...
    hellomyshadow閱讀 253評(píng)論 0 0
  • 第一個(gè)React程序 函數(shù)式組件 class組件 組件的組合和嵌套 將一個(gè)組件渲染到另一個(gè)組件內(nèi)部構(gòu)成父子組件關(guān)系...
    null_7d53閱讀 243評(píng)論 0 0