国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) web前端 js教程 帶鉤子的 React 中不存在生命周期

帶鉤子的 React 中不存在生命周期

Nov 14, 2024 pm 03:18 PM

Lifecycle doesn

很久很久以前,我們?cè)陬愔惺褂昧?React,還記得嗎?

當(dāng)時(shí),我們有了生命周期方法的概念,即接受在特定時(shí)刻執(zhí)行的回調(diào)的類上的方法。三巨頭:裝載時(shí)、更新時(shí)和卸載時(shí)。

古老但黃金的課程

這很重要,在類組件上,返回的 JSX 是在 render 方法上生成的,狀態(tài)附加到組件的 this 上,并且應(yīng)用程序開(kāi)發(fā)人員需要一種方法來(lái)知道在某些時(shí)刻執(zhí)行操作。我們對(duì)組件生命周期的時(shí)間有了概念:

  • componentDidMount 是組件首次渲染并向 DOM 添加元素的時(shí)刻,也是開(kāi)始連接和 API 請(qǐng)求等副作用的時(shí)刻。
  • shouldComponentUpdate 允許您手動(dòng)設(shè)置邏輯來(lái)比較下一個(gè) props 和狀態(tài),并返回一個(gè)布爾值來(lái)定義是否可以跳過(guò)重新渲染。
  • componentDidUpdate 是狀態(tài)或 props 更改的時(shí)刻,再次調(diào)用 render 方法并對(duì)身份差異進(jìn)行協(xié)調(diào)更改并應(yīng)用于 DOM,有助于將狀態(tài)與新 props 同步并執(zhí)行邏輯操作。
  • componentWillUnmount 是 React 將從 DOM 中刪除元素的時(shí)候,是清理內(nèi)容和避免內(nèi)存泄漏的好地方。

當(dāng)然,您有一個(gè)重要的 API,例如forceUpdate,如果您使用的外部數(shù)據(jù)無(wú)法與 React 狀態(tài)更新連接,它允許您手動(dòng)觸發(fā)重新渲染。

在概念層面上,我們有一種更直接的方式來(lái)執(zhí)行應(yīng)用程序的流程。生命周期方法遵循 DOM 元素的類似生命周期,您可以自己執(zhí)行 memo 和 forceUpdates,同步狀態(tài)是執(zhí)行邏輯的默認(rèn)方式。

這種直接性被認(rèn)為是簡(jiǎn)單的,與反應(yīng)式模型相比,學(xué)習(xí)這些概念更容易。但后來(lái),Hooks 出現(xiàn)并改變了一切。

未命名的反應(yīng)性

過(guò)渡令人困惑。首先,為了讓開(kāi)發(fā)變得簡(jiǎn)單,并在某種程度上維護(hù)開(kāi)發(fā)人員所擁有的 React 模型的概念愿景,許多交流試圖展示 hooks 模型的相似之處。為了擁有 3 個(gè)主要的生命周期方法,他們展示了 useEffect 的解決方法。

// componentDidMount
 useEffect(() => {
    // code...

    // componentWillUnmount:
    return function cleanup() {
      // code...
    };
  }, []);

// componentDidUpdate
 useEffect(() => {
    // code...

  }, [dependencyState, dependencyProp]);

所以,大多數(shù)用 hooks 編寫的新 React 代碼都遵循這個(gè)想法,開(kāi)始同步狀態(tài)是一個(gè)自然的過(guò)程。為了保持生命周期方法的相同理念,這是調(diào)用 setState 并觸發(fā)重新渲染過(guò)程的地方。

有什么問(wèn)題嗎?

同步狀態(tài)成為問(wèn)題,useEffect 的錯(cuò)誤使用成為問(wèn)題,雙重重新渲染成為問(wèn)題,太多重新渲染成為問(wèn)題,性能成為問(wèn)題。

React 的這一步有點(diǎn)令人困惑,至少對(duì)我來(lái)說(shuō)是這樣。因?yàn)?,轉(zhuǎn)向鉤子就是轉(zhuǎn)向反應(yīng)式模型,即使它是一個(gè)粗粒度的模型。但傳達(dá)的信息是,沒(méi)有什么大的變化。沒(méi)有關(guān)于反應(yīng)性概念和理論的內(nèi)容,即使使用 React 多年,我也只是閱讀 Ryan Carniato 關(guān)于反應(yīng)性和固體的博客文章才開(kāi)始真正理解反應(yīng)性。

即使知道 useEffect 有一個(gè)誤用,我真的不明白為什么,而且缺乏關(guān)于反應(yīng)性的概念理論使得鉤子很容易犯錯(cuò)誤。 useEffect 成為最令人討厭的 hook,被一些人稱為“useFootgun”。關(guān)鍵是,React 中存在概念上的混亂,表現(xiàn)為我們今天看到的 useEffect 的所有問(wèn)題。

useEffect問(wèn)題不是問(wèn)題的原因,而是問(wèn)題的結(jié)果。

鉤子的生命周期怎么樣

所以,這就是事情。反應(yīng)性的概念中沒(méi)有生命周期。

你發(fā)生了變化,你對(duì)它做出反應(yīng),產(chǎn)生副作用。效果是結(jié)果,而不是原因。沒(méi)有狀態(tài)同步,也沒(méi)有掛載和卸載的概念。

無(wú)論是卸載前的第一個(gè)、第十個(gè)還是最后一個(gè)渲染都沒(méi)有關(guān)系,而且鉤子不關(guān)心它,順便說(shuō)一句,甚至 useEffect。

嘗試一下:

// componentDidMount
 useEffect(() => {
    // code...

    // componentWillUnmount:
    return function cleanup() {
      // code...
    };
  }, []);

// componentDidUpdate
 useEffect(() => {
    // code...

  }, [dependencyState, dependencyProp]);

您將在控制臺(tái)上看到每次狀態(tài)更新時(shí)都會(huì)執(zhí)行這兩個(gè)函數(shù)。首先是清理,然后是效果回調(diào)。如果您使用帶有某些狀態(tài)或?qū)傩缘?useEffect 來(lái)進(jìn)行訂閱,則每次依賴項(xiàng)發(fā)生更改時(shí),都會(huì)調(diào)用清理函數(shù),然后調(diào)用新的回調(diào),再次進(jìn)行訂閱,但使用新值。

您應(yīng)該將應(yīng)用程序代碼視為簡(jiǎn)化的 React 模型:

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

  useEffect(() => {
    console.log('effect', count);

    return () => {
      console.log('clean up', count);
    }
  }, [count]);

  return (
    <button onClick={() => setCount((state) => state + 1)}>
      {count}
    </button>
  )
}

如果您有這樣的組件:

UI = fn(state)

當(dāng)您單擊按鈕并將計(jì)數(shù)加 1 時(shí),您真正擁有的概念上是這樣的:

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

  return (
    <button onClick={() => setCount((state) => state + 1)}>
      {count}
    </button>
  )
}

每次點(diǎn)擊都會(huì)再次調(diào)用 fn,并使用新的狀態(tài),生成新版本的 UI。狀態(tài)應(yīng)該通過(guò)用戶的操作或通過(guò)異步派生生成的異步值來(lái)更改。

這樣你就可以保持干凈的想法:

  • 狀態(tài)轉(zhuǎn)換進(jìn)行新的 fn 調(diào)用
  • 在新?tīng)顟B(tài)下,您將獲得 UI 描述
  • 如果不同,請(qǐng)更新屏幕。

一個(gè)干凈且一致的模型。

渲染器需要關(guān)心在屏幕上添加、更新和刪除元素。在組件級(jí)別,重要的是:

  • 如果狀態(tài)改變
  • 應(yīng)用程序是否可以處理用戶操作
  • JSX 中返回的結(jié)構(gòu)。

Hooks 及其響應(yīng)式模型使 React 與瀏覽器解耦,使應(yīng)用程序代碼不必關(guān)心您處于屏幕渲染過(guò)程的哪個(gè)時(shí)刻。您不再?gòu)?qiáng)制更新,甚至不再按照自己的規(guī)則處理備忘錄,這對(duì)于應(yīng)用開(kāi)發(fā)人員來(lái)說(shuō)不太直接,但在模型方面更直接。

每次重新渲染都會(huì)生成一個(gè)結(jié)構(gòu),React 負(fù)責(zé)剩下的事情。

以上是帶鉤子的 React 中不存在生命周期的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開(kāi)發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

Java vs. JavaScript:清除混亂 Java vs. JavaScript:清除混亂 Jun 20, 2025 am 12:27 AM

Java和JavaScript是不同的編程語(yǔ)言,各自適用于不同的應(yīng)用場(chǎng)景。Java用于大型企業(yè)和移動(dòng)應(yīng)用開(kāi)發(fā),而JavaScript主要用于網(wǎng)頁(yè)開(kāi)發(fā)。

JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 JavaScript評(píng)論:簡(jiǎn)短說(shuō)明 Jun 19, 2025 am 12:40 AM

JavascriptconcommentsenceenceEncorenceEnterential gransimenting,reading and guidingCodeeXecution.1)單inecommentsareusedforquickexplanations.2)多l(xiāng)inecommentsexplaincomplexlogicorprovideDocumentation.3)

如何在JS中與日期和時(shí)間合作? 如何在JS中與日期和時(shí)間合作? Jul 01, 2025 am 01:27 AM

JavaScript中的日期和時(shí)間處理需注意以下幾點(diǎn):1.創(chuàng)建Date對(duì)象有多種方式,推薦使用ISO格式字符串以保證兼容性;2.獲取和設(shè)置時(shí)間信息可用get和set方法,注意月份從0開(kāi)始;3.手動(dòng)格式化日期需拼接字符串,也可使用第三方庫(kù);4.處理時(shí)區(qū)問(wèn)題建議使用支持時(shí)區(qū)的庫(kù),如Luxon。掌握這些要點(diǎn)能有效避免常見(jiàn)錯(cuò)誤。

為什么要將標(biāo)簽放在的底部? 為什么要將標(biāo)簽放在的底部? Jul 02, 2025 am 01:22 AM

PlacingtagsatthebottomofablogpostorwebpageservespracticalpurposesforSEO,userexperience,anddesign.1.IthelpswithSEObyallowingsearchenginestoaccesskeyword-relevanttagswithoutclutteringthemaincontent.2.Itimprovesuserexperiencebykeepingthefocusonthearticl

JavaScript與Java:開(kāi)發(fā)人員的全面比較 JavaScript與Java:開(kāi)發(fā)人員的全面比較 Jun 20, 2025 am 12:21 AM

JavaScriptIspreferredforredforwebdevelverment,而Javaisbetterforlarge-ScalebackendsystystemsandSandAndRoidApps.1)JavascriptexcelcelsincreatingInteractiveWebexperienceswebexperienceswithitswithitsdynamicnnamicnnamicnnamicnnamicnemicnemicnemicnemicnemicnemicnemicnemicnddommanipulation.2)

什么是在DOM中冒泡和捕獲的事件? 什么是在DOM中冒泡和捕獲的事件? Jul 02, 2025 am 01:19 AM

事件捕獲和冒泡是DOM中事件傳播的兩個(gè)階段,捕獲是從頂層向下到目標(biāo)元素,冒泡是從目標(biāo)元素向上傳播到頂層。1.事件捕獲通過(guò)addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委托,提高動(dòng)態(tài)內(nèi)容處理效率;5.捕獲可用于提前攔截事件,如日志記錄或錯(cuò)誤處理。了解這兩個(gè)階段有助于精確控制JavaScript響應(yīng)用戶操作的時(shí)機(jī)和方式。

JavaScript:探索用于高效編碼的數(shù)據(jù)類型 JavaScript:探索用于高效編碼的數(shù)據(jù)類型 Jun 20, 2025 am 12:46 AM

javascripthassevenfundaMentalDatatypes:數(shù)字,弦,布爾值,未定義,null,object和symbol.1)numberSeadUble-eaduble-ecisionFormat,forwidevaluerangesbutbecautious.2)

如何減少JavaScript應(yīng)用程序的有效載荷大?。? />
								</a>
								<a href=如何減少JavaScript應(yīng)用程序的有效載荷大??? Jun 26, 2025 am 12:54 AM

如果JavaScript應(yīng)用加載慢、性能差,問(wèn)題往往出在payload太大,解決方法包括:1.使用代碼拆分(CodeSplitting),通過(guò)React.lazy()或構(gòu)建工具將大bundle拆分為多個(gè)小文件,按需加載以減少首次下載量;2.移除未使用的代碼(TreeShaking),利用ES6模塊機(jī)制清除“死代碼”,確保引入的庫(kù)支持該特性;3.壓縮和合并資源文件,啟用Gzip/Brotli和Terser壓縮JS,合理合并文件并優(yōu)化靜態(tài)資源;4.替換重型依賴,選用輕量級(jí)庫(kù)如day.js、fetch

See all articles