React 第五天:Hooks

1. withRouter

組件導(dǎo)出時(shí)用它來(lái)包裹僻造,這樣才能在組件內(nèi)使用 this.props.history/location/match

export default withRouter(adminSubjectType);

https://blog.csdn.net/weixin_43271750/article/details/86299567

一缘挽、Hook:JavaScript 函數(shù)

1.基本使用規(guī)則

(1)只能在 函數(shù)最外層 調(diào)用 Hook。不要在 循環(huán)律想、條件判斷 或者 子函數(shù) 中調(diào)用。如果我們想要有條件地執(zhí)行一個(gè) effect,可以將判斷放到 Hook 的內(nèi)部:

  useEffect(function persistForm() {
    // ?? 將條件判斷放置在 effect 中
    if (name !== '') {
      localStorage.setItem('formData', name);
    }
  });

(2)只能在 React 的 函數(shù)組件中調(diào)用 Hook舷嗡。不要在其他 JavaScript 函數(shù)中調(diào)用扫外,Hook 在 class 內(nèi)部是 不起作用的(另外莉钙,自定義Hook中也可以調(diào)用Hook)
(3)單個(gè)組件內(nèi),無(wú)論是State Hook或者Effect Hook筛谚,都可以 多次被調(diào)用磁玉。

2.State Hook

使用:
(1)引入 useState Hook。
(2)通過(guò) useState() 聲明變量驾讲、聲明修改變量的方法蚊伞、為變量初始化值。
(3)調(diào)用 修改變量的方法 修改狀態(tài)值吮铭,注意 函數(shù)組件內(nèi)沒(méi)有this时迫。

寫(xiě)法一:直接將最新值作為參數(shù)傳入 setState(最新值)
寫(xiě)法二:函數(shù)作為參數(shù),接收舊值谓晌,手動(dòng)返回新值 setState((oldValue)=>newValue)

 1:  import React, { useState } from 'react';
 2:
 3:  function Example() {
 4:    const [count, setCount] = useState(100);
 5:
 6:    return (
 7:      <div>
 8:        <p>You clicked {count} times</p>
 9:        <button onClick={() => setCount(count + 1)}>
10:         Click me
11:        </button>
12:      </div>
13:    );
14:  }

說(shuō)明:
(1)useState()函數(shù)接收的參數(shù)掠拳,就是 變量的初始值,可以是數(shù)字纸肉、字符串溺欧、數(shù)組、對(duì)象毁靶、等數(shù)據(jù)類(lèi)型胧奔。
(2)useState()函數(shù)的返回值是一個(gè)數(shù)組,分別代表 當(dāng)前 state 以及 更新 state 的函數(shù)预吆。

3. Effect Hook

(1)引入 useEffec tHook龙填。
(2)調(diào)用時(shí),第一個(gè)參數(shù)是一個(gè) 函數(shù),第二個(gè)參數(shù)是一個(gè) 數(shù)組岩遗。

useEffect(()=>{ }扇商,[])

① 第一個(gè)參數(shù)相當(dāng)于 生命周期鉤子
② 第二個(gè)參數(shù)相當(dāng)于 監(jiān)聽(tīng)某些state數(shù)據(jù)的變化宿礁。
③ 如果不傳第二個(gè)數(shù)組案铺,則第一個(gè)函數(shù)相當(dāng)于componentDidMountcomponentDidUpdate梆靖,在 頁(yè)面首次渲染 后和 每次更新 后都會(huì)執(zhí)行控汉。
④ 如果傳了第二個(gè)數(shù)組,則第一個(gè)函數(shù)會(huì)在 頁(yè)面首次渲染返吻、被監(jiān)聽(tīng)的數(shù)據(jù)更新 時(shí)被調(diào)用姑子。

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

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

  // 無(wú)需清除的副作用:DOM首次渲染完成 或 更新后,設(shè)置標(biāo)題
  useEffect(() => {
    document.title = `你點(diǎn)擊了 ${count} 次`;
  });

  //  無(wú)需清除的副作用:只在DOM首次渲染完成時(shí)執(zhí)行
  useEffect(()=>{
   console.log('DOM首次渲染完成测僵!')
  },[])

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

(3)如果想要 清除副作用街佑,在useEffect()的執(zhí)行器函數(shù)中,返回一個(gè)函數(shù)捍靠,被返回的函數(shù)就相當(dāng)于 componentWillUnmount沐旨,可以進(jìn)行清除定時(shí)器等清除操作。

  handler=()=>{
   console.log('瀏覽器大小發(fā)生了變化')
  }
  useEffect(() => {
    window.addEventListener('resize'榨婆,handler)
    return () => {
      window.removeEventListener('resize'磁携,handler)
    };
  });

另外:將 useEffect() 放在 組件內(nèi)部,讓我們可以在 effect 中直接訪問(wèn) state 變量(或其他 props)纲辽。

4.Ref Hook

類(lèi)似于類(lèi)組件中 createRef() 的使用:
(1)引入 useRef
(2)調(diào)用 useRef() 函數(shù)

const myRef = useRef()

(3)給組件綁定ref

<input ref={myRef} />

注意:不能給函數(shù)組件綁定Ref
① 如果 子組件函數(shù)組件颜武,父組件想要給子組件綁定Ref來(lái)獲取子組件數(shù)據(jù)的話(huà),需要用到 forwdRef拖吼。
② 先在父組件內(nèi)定義Ref變量,并給子組件 綁定Ref这吻。
③ 子組件內(nèi)吊档,子組件函數(shù)要 用forwdRef()函數(shù)包裹,函數(shù)第二個(gè)參數(shù)可以拿到父組件Ref唾糯。
④ 通過(guò)react 的 useImperativeHandle() 函數(shù)怠硼,可以暴露數(shù)據(jù)、方法給父組件移怯。

import React, {useRef} from 'react';

const Father= (props) => {
  const SonRef= useRef(null)
  return <TableInfo title="資產(chǎn)所有人" ref={SonRef}></TableInfo>
}
import React, {useImperativeHandle, useState, forwardRef} from 'react';

const TableInfo = (props, parentRef)=>{
    const [data, setData] = useState([1,2,3])
    // 設(shè)置暴露給父組件的數(shù)據(jù)
    useImperativeHandle(parentRef, () => ({data}));
}

export default forwardRef(TableInfo)

⑤ 用useRef定義的變量可以跨頁(yè)生效香璃,useState變量只在當(dāng)前頁(yè)面生效:const aRef = useRef=(0) ;aRef.current = 80

5.自定義Hook

二舟误、useCallback

1.使用useEffect()請(qǐng)求到接口數(shù)據(jù)后葡秒,會(huì)對(duì)state數(shù)據(jù)進(jìn)行賦值。
2.如果這個(gè)方法 對(duì)自身具有依賴(lài)(組件通訊),或者對(duì)useState中的數(shù)據(jù)有依賴(lài):方法執(zhí)行時(shí),內(nèi)部的賦值操作會(huì)引起頁(yè)面重新渲染——重新渲染會(huì)生成新的方法——而方法本身對(duì)自己有依賴(lài)眯牧,所以方法更新時(shí)方法又會(huì)重新執(zhí)行蹋岩。
參考:http://www.reibang.com/p/be8fb469d507

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

  const getInfo = useCallback((props)=>{
    StructureApi.getDetailInfo(id).then(res => {
        setBasicInfo(res.data.data)
    })
  },[props.match])

  useEffect(() => {
        getInfo(props);
    }, [getInfo]);

三、Fragment

無(wú)論是類(lèi)組件学少、函數(shù)組件中剪个,HtML結(jié)構(gòu)最外層的<div></div>標(biāo)簽,可以替換為:

<Fragment> </Fragment> 或是 <> </>

① Fragment可以接收一個(gè) key屬性 用于遍歷時(shí)的 唯一標(biāo)識(shí)版确。
② 空標(biāo)簽不能接收任何屬性扣囊。

四、錯(cuò)誤邊界

1. 什么是錯(cuò)誤邊界

就是在 親爹 父組件內(nèi)绒疗, 監(jiān)測(cè)如暖、捕獲、處理 可能出現(xiàn)錯(cuò)誤的子組件忌堂,并 渲染備用組件盒至。

2. getDerivedStateFromError( )

(1)在 親爹 父組件內(nèi)添加 生命周期函數(shù) getDerivedStateFromError( )。
(2)參數(shù) 是捕獲到的 子組件錯(cuò)誤對(duì)象士修。
(3)返回值是一個(gè) 對(duì)象枷遂,這個(gè)對(duì)象可以 修改父組件的state數(shù)據(jù)
(4)父組件 提前聲明一個(gè)state數(shù)據(jù)棋嘲,用于判斷子組件是否出錯(cuò)酒唉,并渲染子組件或備用組件。

import React from 'react'
import Kid from './child.jsx'

class Parent extends React.Component {

  // 1.父組件聲明一個(gè)變量沸移,用來(lái)控制渲染 【子組件】 或 【備用組件】
  state = { hasError: false }
  
  // 2. 當(dāng)子組件發(fā)生錯(cuò)誤時(shí)痪伦,獲取錯(cuò)誤信息,并修改父組件的state數(shù)據(jù)雹锣。
  static getDerivedStateFromError (error) {
    return {hasError: error}
 }

  render () {
    return (
      <div>
        {/* 3.根據(jù)hasError判斷是否渲染子組件*/}
        {this.state.hasError ? '子組件出現(xiàn)了錯(cuò)誤网沾! ': <Kid></Kid>}
      </div>
    )
  }
}

// 導(dǎo)出組件
export default Hello

注意:
(1)只能捕獲后代組件 生命周期 產(chǎn)生的錯(cuò)誤,主要針對(duì)的是 render( )蕊爵。
(2)不能捕獲父組件本身錯(cuò)誤辉哥、其他組件在合成事件或定時(shí)器中產(chǎn)生的錯(cuò)誤。

3. componentDidCatch( )

(1)在 父組件 內(nèi)添加這個(gè) 生命周期函數(shù)攒射。
(2)接收兩個(gè)參數(shù)醋旦,用于統(tǒng)計(jì)子組件出現(xiàn)的錯(cuò)誤次數(shù)。

四会放、項(xiàng)目打包

1.npm run build
2. 安裝 serve 插件
3. 執(zhí)行 "serve 文件件名稱(chēng)" 命令
1.PNG
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饲齐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子咧最,更是在濱河造成了極大的恐慌捂人,老刑警劉巖御雕,帶你破解...
    沈念sama閱讀 221,331評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異先慷,居然都是意外死亡饮笛,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,372評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)论熙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)福青,“玉大人,你說(shuō)我怎么就攤上這事脓诡∥尬纾” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,755評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵祝谚,是天一觀的道長(zhǎng)宪迟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)交惯,這世上最難降的妖魔是什么次泽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,528評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮席爽,結(jié)果婚禮上意荤,老公的妹妹穿的比我還像新娘。我一直安慰自己只锻,他們只是感情好玖像,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,526評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著齐饮,像睡著了一般捐寥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祖驱,一...
    開(kāi)封第一講書(shū)人閱讀 52,166評(píng)論 1 308
  • 那天握恳,我揣著相機(jī)與錄音,去河邊找鬼羹膳。 笑死睡互,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的陵像。 我是一名探鬼主播,決...
    沈念sama閱讀 40,768評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寇壳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼醒颖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起壳炎,我...
    開(kāi)封第一講書(shū)人閱讀 39,664評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤泞歉,失蹤者是張志新(化名)和其女友劉穎逼侦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腰耙,經(jīng)...
    沈念sama閱讀 46,205評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡榛丢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,290評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挺庞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晰赞。...
    茶點(diǎn)故事閱讀 40,435評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖选侨,靈堂內(nèi)的尸體忽然破棺而出掖鱼,到底是詐尸還是另有隱情,我是刑警寧澤援制,帶...
    沈念sama閱讀 36,126評(píng)論 5 349
  • 正文 年R本政府宣布戏挡,位于F島的核電站,受9級(jí)特大地震影響晨仑,放射性物質(zhì)發(fā)生泄漏褐墅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,804評(píng)論 3 333
  • 文/蒙蒙 一洪己、第九天 我趴在偏房一處隱蔽的房頂上張望妥凳。 院中可真熱鬧,春花似錦码泛、人聲如沸猾封。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,276評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晌缘。三九已至,卻和暖如春痢站,著一層夾襖步出監(jiān)牢的瞬間磷箕,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工阵难, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岳枷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,818評(píng)論 3 376
  • 正文 我出身青樓呜叫,卻偏偏與公主長(zhǎng)得像空繁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子朱庆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,442評(píng)論 2 359

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