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

首頁 web前端 js教程 帶鉤子的 React 中不存在生命週期

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

Nov 14, 2024 pm 03:18 PM

Lifecycle doesn

很久很久以前,我們在類別中使用了 React,還記得嗎?

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

古老但黃金的課程

這很重要,在類別元件上,傳回的 JSX 是在 render 方法上產(chǎn)生的,狀態(tài)附加到元件的 this 上,並且應(yīng)用程式開發(fā)人員需要一種方法來知道在某些時(shí)刻執(zhí)行操作。我們對組件生命週期的時(shí)間有了概念:

  • componentDidMount 是元件首次渲染並為 DOM 添加元素的時(shí)刻,也是開始連接和 API 請求等副作用的時(shí)刻。
  • shouldComponentUpdate 可讓您手動設(shè)定邏輯來比較下一個(gè) props 和狀態(tài),並傳回布林值來定義是否可以跳過重新渲染。
  • componentDidUpdate 是狀態(tài)或 props 變更的時(shí)刻,再次呼叫 render 方法並對身分差異進(jìn)行協(xié)調(diào)變更並應(yīng)用於 DOM,有助於將狀態(tài)與新 props 同步並執(zhí)行邏輯操作。
  • componentWillUnmount 是 React 將從 DOM 中刪除元素的時(shí)候,是清理內(nèi)容和避免記憶體洩漏的好地方。

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

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

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

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

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

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

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

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

  }, [dependencyState, dependencyProp]);

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

有什麼問題嗎?

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

React 的這一步有點(diǎn)令人困惑,至少對我來說是這樣。因?yàn)椋D(zhuǎn)向鉤子就是轉(zhuǎn)向反應(yīng)式模型,即使它是一個(gè)粗粒度的模型。但傳達(dá)的訊息是,沒有什麼大的改變。沒有關(guān)於反應(yīng)性概念和理論的內(nèi)容,即使使用 React 多年,我也只是閱讀 Ryan Carniato 關(guān)於反應(yīng)性和固體的部落格文章才開始真正理解反應(yīng)性。

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

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

鉤子的生命週期怎麼樣

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

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

無論是卸載前的第一個(gè)、第十個(gè)還是最後一個(gè)渲染都沒有關(guān)係,而且鉤子不關(guān)心它,順便說一句,甚至 useEffect。

試試看:

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

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

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

  }, [dependencyState, dependencyProp]);

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

您應(yīng)該將應(yīng)用程式程式碼視為簡化的 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)您點(diǎn)擊按鈕並將計(jì)數(shù)加 1 時(shí),您真正擁有的概念上是這樣的:

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

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

每次點(diǎn)擊都會再次呼叫 fn,並使用新的狀態(tài),產(chǎn)生新版本的 UI。狀態(tài)應(yīng)該透過使用者的操作或透過非同步派生產(chǎn)生的非同步值來更改。

這樣你就可以保持乾淨(jìng)的想法:

  • 狀態(tài)轉(zhuǎn)換進(jìn)行新的 fn 呼叫
  • 在新狀態(tài)下,您將獲得 UI 描述
  • 如果不同,請更新螢?zāi)弧?

一個(gè)乾淨(jìng)且一致的模型。

渲染器需要關(guān)心在螢?zāi)簧闲略?、更新和刪除元素。在組件級別,重要的是:

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

Hooks 及其響應(yīng)式模型使 React 與瀏覽器解耦,使應(yīng)用程式程式碼不必關(guān)心您處於螢?zāi)讳秩具^程的哪個(gè)時(shí)刻。您不再強(qiáng)制更新,甚至不再按照自己的規(guī)則處理備忘錄,這對於應(yīng)用程式開發(fā)人員來說不太直接,但在模型方面更直接。

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

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

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整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

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

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

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

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

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

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

JavaScript與Java:開發(fā)人員的全面比較 JavaScript與Java:開發(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.事件捕獲通過addEventListener的useCapture參數(shù)設(shè)為true實(shí)現(xiàn);2.事件冒泡是默認(rèn)行為,useCapture設(shè)為false或省略;3.可使用event.stopPropagation()阻止事件傳播;4.冒泡支持事件委託,提高動態(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)用程序的有效載荷大??? 如何減少JavaScript應(yīng)用程序的有效載荷大??? Jun 26, 2025 am 12:54 AM

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

JavaScript模塊上的確定JS綜述:ES模塊與COMPORJS JavaScript模塊上的確定JS綜述:ES模塊與COMPORJS Jul 02, 2025 am 01:28 AM

ES模塊和CommonJS的主要區(qū)別在於加載方式和使用場景。 1.CommonJS是同步加載,適用於Node.js服務(wù)器端環(huán)境;2.ES模塊是異步加載,適用於瀏覽器等網(wǎng)絡(luò)環(huán)境;3.語法上,ES模塊使用import/export,且必須位於頂層作用域,而CommonJS使用require/module.exports,可在運(yùn)行時(shí)動態(tài)調(diào)用;4.CommonJS廣泛用於舊版Node.js及依賴它的庫如Express,ES模塊則適用於現(xiàn)代前端框架和Node.jsv14 ;5.雖然可混合使用,但容易引發(fā)問題

See all articles