react hooks學習

hooks 注意點

  • hooks 在使用時必須保證其調(diào)用順序醇锚,不能將 hooks 的調(diào)用放在 if for 等流程控制語句中哼御,也不能將 hooks 調(diào)用放在子函數(shù)中。
  • hooks 只能放在 函數(shù)組件或自定義 hook 的最外層調(diào)用焊唬。

狀態(tài)鉤子 useState

  • react 自帶一個 hook 函數(shù)恋昼,聲明組件狀態(tài)
  • 參數(shù)可以設(shè)置 state 的初始值
  • 返回值是一個只有兩個元素的數(shù)組[狀態(tài),狀態(tài)更新函數(shù)]
    const [狀態(tài), 修改該狀態(tài)的方法] = useState(初始值)
    注意
    1赶促、在同一個函數(shù)中可以使用 useState 定義多個狀態(tài)
    2液肌、useState 返回的狀態(tài)是一個引用類型,修改時鸥滨,只修改其中一個值嗦哆,并不會幫我們進行淺合并
    3、useState 返回的 setState 方法同樣是異步方法 - 同樣會被批處理所監(jiān)管

副作用鉤子 useEffect

  • 可以取代聲明周期函數(shù) componentDidMount婿滓、componentDidUpdate老速、componentWillUnmonent
  • 給函數(shù)式組件添加副作用
  • 副作用(Dom操作,數(shù)據(jù)請求)hook - 主要用來處理組件中的作用類型凸主,用于替代生命周期
useEffect(() => {
    effect: 副作用函數(shù),
    return(() => {
        cleanup 清理函數(shù)
    })
}, [input]) input: 依賴參數(shù)
  • 掛載階段:從上到下執(zhí)行函數(shù)組件橘券,如果碰到 useEffect 就將其中的 effect 存儲到一個隊列中。當組件掛載完成之后卿吐,按照隊列順序執(zhí)行 effect 函數(shù)旁舰,并獲取 cleanup 函數(shù),存儲至一個新的隊列
  • 更新階段:從上到下執(zhí)行函數(shù)組件嗡官,如果碰到 useEffect 就將其中的 effect 存儲到一個隊列中箭窜。當組件更新完成之后,會將之前存儲的 cleanup 函數(shù)隊列谨湘,按照順序執(zhí)行绽快。然后執(zhí)行 effect 隊列芥丧,并獲取 cleanup 函數(shù)紧阔,存儲至一個新的隊列。在更新階段會觀察依賴參數(shù)的值有沒有發(fā)生變化续担,如果沒有變化就不執(zhí)行對應(yīng)的 cleanup 和 effect擅耽。
  • 卸載階段:找到之前存儲的 cleanup 函數(shù)隊列,依次執(zhí)行

useEffect 依賴參數(shù)給不同值的情況物遇;

  • 情況一:為空或者為null
useEffect(() => {
  console.log("useEffect");
});

這個時候乖仇,組件初始化憾儒、更新都會觸發(fā)。

  • 情況二:依賴參數(shù)為空數(shù)組
useEffect(() => {
  console.log("useEffect");
}, []);

這個時候乃沙,只有組件初始化會觸發(fā)起趾。

  • 情況三:依賴參數(shù)
useEffect(() => {
  console.log("useEffect");
}, [state]);

這個時候,組件初始化會執(zhí)行警儒、只要有一個依賴參數(shù)有變化更新都會觸發(fā)更新训裆。

注意:
useEffect 是延遲執(zhí)行的,如果想要同時執(zhí)行蜀铲,則需要用 useLayoutEffect

useLayoutEffect

和 useEffect 相識边琉,唯一的區(qū)別就是 useLayoutEffect 是同步執(zhí)行的。

使用場景:
一個對用戶可見的 DOM 變更就必須在瀏覽器執(zhí)行下一次繪制前被同步執(zhí)行记劝,這樣用戶才不會感覺到視覺上的不一致变姨。

useRef

語法 const refContainer = useRef(initialValue);
useRef 返回一個可變的 ref 對象,其 .current 屬性被初始化為傳入的參數(shù)(initialValue)厌丑。返回的 ref 對象在組件的整個生命周期內(nèi)持續(xù)存在定欧。

  • useRef 除了可以保存實例之外,還可以保存組件更新前的一些數(shù)據(jù)
    • 當 useRef 保存的是數(shù)據(jù)時怒竿,數(shù)據(jù)不會隨著組件的更新而自動更新忧额。一般可以用來保存一些接口的參數(shù) params

案例

function TextInputWithFocusButton() {
  const inputEl = useRef(null);
  const params = useRef({
    name: "",
    password: "",
  });
  
  const onButtonClick = () => {
    // `current` 指向已掛載到 DOM 上的文本輸入元素
    inputEl.current.focus();
  };
  
  return (
    <>
      <input ref={inputEl} type="text" />
      <button onClick={onButtonClick}>Focus the input</button>
    </>
  );
}

useMemo

當依賴參數(shù)有變化時,執(zhí)行相應(yīng)函數(shù)愧口,并返回函數(shù)的返回值

案例

const [count,setCount] = useState(10);
const [num,setNum] = useState(1);
const applePrice = useMemo(() => {
    console.log('觸發(fā)');
    return count*18;
},[count]);

return <>
    <div>count: {count}, 總價:{applePrice}元</div>
    <button onClick={() => {
        setCount(count+1);
    }}>count+1</button>
    <div>num: {num}</div>
    <button onClick={() => {
        setNum(num+1);
    }}>num+1</button>
</>

useCallback

useCallback(fn, deps) 相當于 useMemo(() => fn, deps)睦番。

useContext

語法
const value = useContext(MyContext);
接收一個 context 對象

useContext(content) 相當于 <content.Consumer>

// index.js
const defaultContextValue = {
  username: "dj",
};

// 創(chuàng)建一個context
const appContext = React.createContext(defaultContextValue);


// 根節(jié)點
ReactDOM.render(
  <appContext.Provider value={defaultContextValue}>
    <Robot />
  </appContext.Provider>,
  document.getElementById("root")
);

// 子組件
function Robot() {
  const context = useContext(appContext);
  return (
    <p>{context.username}</p>
  );
};

useReducer

語法
const [state, dispatch] = useReducer(reducer, initialArg, init);

useReducer 可以接收三個參數(shù),reducer耍属、initialArg托嚣、init。

  • reducer 為 redux 的控制器厚骗;
  • initialArg 為初始值示启;
  • init 是一個方法,可以修改初始值想

案例

// 將字符串 "0" 變?yōu)?0
const init = (initArg) => {
  return initArg - 0;
}

export default function HooksPage(props) {
  const [state, dispatch] = useReducer(counterReducer, "0", init);
  return (
    <div>
      <h3>HooksPage</h3>
      <div>{state}</div>
      <button onClick={() => dispatch({type: "ADD", payload: 1})}>add</button>
    </div>
  )
}

useImperativeHandle

語法 useImperativeHandle(ref, createHandle, [deps])
useImperativeHandle 可以讓你在使用 ref 時自定義暴露給父組件的實例值领舰。在大多數(shù)情況下夫嗓,應(yīng)當避免使用 ref 這樣的命令式代碼。useImperativeHandle 應(yīng)當與 forwardRef 一起
案例

function FancyInput(props, ref) {
  const inputRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => {
      inputRef.current.focus();
    }
  }));
  return <input ref={inputRef} ... />;
}
FancyInput = forwardRef(FancyInput);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末冲秽,一起剝皮案震驚了整個濱河市舍咖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锉桑,老刑警劉巖排霉,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異民轴,居然都是意外死亡攻柠,警方通過查閱死者的電腦和手機球订,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑰钮,“玉大人冒滩,你說我怎么就攤上這事±饲矗” “怎么了旦部?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長较店。 經(jīng)常有香客問我士八,道長,這世上最難降的妖魔是什么梁呈? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任婚度,我火速辦了婚禮,結(jié)果婚禮上官卡,老公的妹妹穿的比我還像新娘蝗茁。我一直安慰自己,他們只是感情好寻咒,可當我...
    茶點故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布哮翘。 她就那樣靜靜地躺著,像睡著了一般毛秘。 火紅的嫁衣襯著肌膚如雪饭寺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天叫挟,我揣著相機與錄音艰匙,去河邊找鬼。 笑死抹恳,一個胖子當著我的面吹牛员凝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奋献,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼健霹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓶蚂?” 一聲冷哼從身側(cè)響起糖埋,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扬跋,沒想到半個月后阶捆,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡钦听,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年洒试,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朴上。...
    茶點故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡垒棋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痪宰,到底是詐尸還是另有隱情叼架,我是刑警寧澤,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布衣撬,位于F島的核電站乖订,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏具练。R本人自食惡果不足惜乍构,卻給世界環(huán)境...
    茶點故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扛点。 院中可真熱鬧哥遮,春花似錦、人聲如沸陵究。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铜邮。三九已至仪召,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間松蒜,已是汗流浹背返咱。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留牍鞠,地道東北人咖摹。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像难述,于是被迫代替她去往敵國和親萤晴。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,585評論 2 359

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