亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

防止 useEffect hook 在 ComponentDidMount() 上運行

防止 useEffect hook 在 ComponentDidMount() 上運行

蝴蝶不菲 2022-08-27 09:24:22
此代碼在更改時運行(應該如此),但它也會在組件首次加載時運行。如何讓它僅在后續更改時運行,而不是在第一次設置默認值時運行?namenameconst [name, setName] = useState('');useEffect(() => {  alert('Hi ' + name);}, [name]);
查看完整描述

3 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

使用 ref,您可以跟蹤第一個渲染,在第一個渲染后設置為 false。


const firstRenderRef = useRef(true);

const [name, setName] = useState('');


useEffect(() => {

  if (firstRenderRef.current) {

    firstRenderRef.current = false;

  } else {

    alert('Hi ' + name);

  }

}, [name]);

不過,我會把它分解成一個自定義的鉤子。


const useSkipFirstEffect = (callback, dependencies) => {

  const firstRenderRef = useRef(true);


  useEffect(() => {

    if (firstRenderRef.current) {

      firstRenderRef.current = false;

    } else {

      callback();

    }

  }, [callback, ...dependencies]);

};

用法:


useSkipFirstEffect(() => {

  alert('SkipFirstEffect: Hi ' + name);

}, [name]);


查看完整回答
反對 回復 2022-08-27
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

有一些方法可以跳過初始渲染的效果(如ref和使用變量)。我通常使用并發現最簡單的方法是使用useEffect。在我看來,這是一種有點黑客的方式,但它有效 -return


const [name, setName] = useState('');


useEffect(() => {

  //don't do anything on initial render

  return () => {

      alert('Hi ' + name);

   }

}, [name]);

現在,僅當依賴項發生更改時,才會運行此功能。我不確定它是否被推薦,但它總是為我工作,沒有任何問題。離開這里以防萬一。name


注意::這也將在組件卸載更改時運行。為了防止這種情況,您可以只使用檢查。


查看完整回答
反對 回復 2022-08-27
?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

這導致自定義鉤子多次重新運行,因為您正在依賴項數組中重新創建一個新數組,我會像這樣更改它:[callback, ...dependencies]


import { useEffect, useRef } from 'react'


function useEffectSkipFirst(callback, dependencies) {

  const firstRenderRef = useRef(true)


  useEffect(() => {

    if (firstRenderRef.current) {

      firstRenderRef.current = false

      return

    }

    callback()

  }, dependencies)

}


export default useEffectSkipFirst


查看完整回答
反對 回復 2022-08-27
  • 3 回答
  • 0 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號