React三:函數(shù)組件

react函數(shù)組件與hooks

組件每次更新時(shí)都會(huì)重新執(zhí)行函數(shù)

HOOK介紹

每次渲染時(shí)它們的調(diào)用順序是不變的

你可以在一個(gè)組件中多次使用 State Hook:

- React 函數(shù)組件中

- React 自定義 Hook 中

- 只在最頂層使用 Hook:在 React 中要保證 hook 的執(zhí)行順序穆趴,組件前和更新后 hook 的執(zhí)行順序要保持一致

useState

接受初始狀態(tài)值锈麸,可以是任何數(shù)據(jù)類(lèi)型邮绿。返回一個(gè)數(shù)組炼杖,分別為狀態(tài)值和修改狀態(tài)值的方法卖鲤。
同樣會(huì)受到批處理影響甜熔,多次使用 setState 會(huì)被合并只執(zhí)行一次更新器腋。
初始 state 參數(shù)只有在第一次渲染時(shí)會(huì)被用到伏钠。
setState可以接受新值盗痒,也可以接受函數(shù)蚂蕴,入?yún)楦虑暗闹?返回新值。
function Counter({initialCount}) {
  const [count, setCount] = useState(initialCount);
  return (
    <>
      Count: {count}
      <button onClick={() => setCount(initialCount)}>Reset</button>
      <button onClick={() => setCount(prevCount => prevCount - 1)}>-</button>
      <button onClick={() => setCount(prevCount => prevCount + 1)}>+</button>
    </>
  );
}

惰性初始 state:如果初始 state 需要通過(guò)復(fù)雜計(jì)算獲得俯邓,則可以傳入一個(gè)函數(shù)骡楼,在函數(shù)中計(jì)算并返回初始的 state,此函數(shù)只在初始渲染時(shí)被調(diào)用:

const [state, setState] = useState(() => {
  const initialState = someExpensiveComputation(props);
  return initialState;
});

需要解構(gòu)賦值
function App() {
  const [person, setPerson] = useState({ name: 'le', age: 18 })
  function handleCount() {
    setCount(() => count + 1)
    document.title = count//title是加1前的值
  }
  return (
    <div>
      {count}
      {person.name + ':' + person.age}
      <button onClick={() => setPerson({ ...person, age: person.age + 1 })} >年齡加1</button>
    </div>
  )
}

Effect Hook

一般用于處理副作用(數(shù)據(jù)獲取稽鞭、訂閱或者手動(dòng)修改過(guò) DOM等)。

掛載階段:

依次將 effect 函數(shù),存儲(chǔ)到一個(gè)隊(duì)列中桂塞,當(dāng)組件掛載完成之后刊愚,依次執(zhí)行 effect 隊(duì)列,獲取 cleanup 函數(shù)吩抓,將 cleanup 函數(shù)存入一個(gè)隊(duì)列涉茧。

更新階段:

依次將 effect 函數(shù),存儲(chǔ)到一個(gè)隊(duì)列中琴拧,當(dāng)組件更新完成之后降瞳,找到 cleanup 隊(duì)列,依次執(zhí)行蚓胸。按添加順序執(zhí)行 effect 隊(duì)列挣饥,獲取 cleanup 函數(shù),將 cleanup 函數(shù)存入一個(gè)隊(duì)列沛膳。(useEffect 對(duì)應(yīng)的依賴(lài)數(shù)據(jù)如果沒(méi)變化扔枫,不執(zhí)行)

卸載階段:

依次執(zhí)行cleanup 隊(duì)列

依賴(lài)參數(shù)

  1. 無(wú)依賴(lài)參數(shù), 組件有更新,就會(huì)執(zhí)行其 cleanup 函數(shù) 和 effect 函數(shù)

  2. 空數(shù)組依賴(lài)锹安,則組件更新時(shí)短荐,不會(huì)執(zhí)行其 cleanup 和 effect

  3. 有具體依賴(lài)參數(shù)倚舀,則組件更新時(shí),其依賴(lài)參數(shù)有變化忍宋,會(huì)執(zhí)行其 cleanup 函數(shù) 和 effect 函數(shù)

    useEffect(() => {
        console.log("無(wú)依賴(lài)");
        return () => {
            console.log("cleanup-無(wú)依賴(lài)");
        }
    });
    useEffect(() => {
        console.log("依賴(lài)空數(shù)組");
        return () => {
            console.log("cleanup-依賴(lài)空數(shù)組");
        }
    }, []);
    useEffect(() => {
        console.log("依賴(lài)數(shù)據(jù)");
        return () => {
            console.log("cleanup-依賴(lài)數(shù)據(jù)");
        }
    }, [val, count]);

useContext

接受context痕貌,由距離當(dāng)前組件最近的 <MyContext.Provider>value prop 決定。

//創(chuàng)建context文件
import {createContext} from "react";
const context = createContext();

//使用context函數(shù)
import {useContext} from "react";
const value = useContext(context);

useRef

function TextInputWithFocusButton() {
  const inputEl = useRef(null);
  const onButtonClick = () => {
    // `current` 指向已掛載到 DOM 上的文本輸入元素
    inputEl.current.focus();
  };
  return (
    <>
      <input ref={inputEl} type="text" />
      <button onClick={onButtonClick}>Focus the input</button>
    </>
  );
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末糠排,一起剝皮案震驚了整個(gè)濱河市舵稠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌入宦,老刑警劉巖哺徊,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乾闰,居然都是意外死亡落追,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)涯肩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)轿钠,“玉大人,你說(shuō)我怎么就攤上這事宽菜∫ド牛” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵铅乡,是天一觀的道長(zhǎng)继谚。 經(jīng)常有香客問(wèn)我,道長(zhǎng)阵幸,這世上最難降的妖魔是什么花履? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮挚赊,結(jié)果婚禮上诡壁,老公的妹妹穿的比我還像新娘。我一直安慰自己荠割,他們只是感情好妹卿,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蔑鹦,像睡著了一般夺克。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上嚎朽,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天铺纽,我揣著相機(jī)與錄音,去河邊找鬼哟忍。 笑死狡门,一個(gè)胖子當(dāng)著我的面吹牛陷寝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播其馏,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼凤跑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了叛复?” 一聲冷哼從身側(cè)響起饶火,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎致扯,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體当辐,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抖僵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缘揪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耍群。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖找筝,靈堂內(nèi)的尸體忽然破棺而出蹈垢,到底是詐尸還是另有隱情,我是刑警寧澤袖裕,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布曹抬,位于F島的核電站,受9級(jí)特大地震影響急鳄,放射性物質(zhì)發(fā)生泄漏谤民。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一疾宏、第九天 我趴在偏房一處隱蔽的房頂上張望张足。 院中可真熱鬧,春花似錦坎藐、人聲如沸为牍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碉咆。三九已至,卻和暖如春兼雄,著一層夾襖步出監(jiān)牢的瞬間吟逝,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工赦肋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留块攒,地道東北人励稳。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像囱井,于是被迫代替她去往敵國(guó)和親驹尼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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