欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

react的嚴格模式和解決react useEffect執(zhí)行兩次問題

 更新時間:2025年01月24日 11:05:21   作者:滿腦子技術(shù)的前端工程師  
文章總結(jié):本文詳細探討了React中useEffect執(zhí)行兩次的問題,主要歸因于React的嚴格模式,嚴格模式在開發(fā)模式下會故意重復(fù)調(diào)用一些生命周期方法,以幫助開發(fā)者發(fā)現(xiàn)潛在的問題,包括不安全的生命周期、過時的ref API、廢棄的findDOMNode方法、意外的副作用等

useEffect執(zhí)行兩次

這個問題,主要是剛接觸react的時候發(fā)的問題,當(dāng)時也沒總結(jié)?,F(xiàn)在回過頭來再總結(jié)一次?。?!

能發(fā)現(xiàn)這個問題的,一定是一名細心并且有一顆求知的心。

因為我當(dāng)時接觸React的時候就是這樣的想法。為什么會觸發(fā)兩次?按照正常的聲明周期應(yīng)該執(zhí)行一次的?。。。?!

為什么useEffect執(zhí)行兩次

1.React的嚴格模式(模版創(chuàng)建項目)

  • npx create-react-app my-app 創(chuàng)建React項目
  • npx create-react-app my-app --template typescript 創(chuàng)建typeScript模版的React項目

2.React的嚴格模式(StrictMode包裹顯渲染組件)

root.render(
  //就是下面的代碼 React.StrictMode
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

3.React的嚴格模式作用

StrictMode 是一個用來突出顯示應(yīng)用程序中潛在問題的工具。StrictMode 不會渲染任何可見的 UI。StrictMode 為其后代元素觸發(fā)額外的檢查和警告。

??嚴格模式檢查僅在開發(fā)模式下運行;它們不會影響生產(chǎn)構(gòu)建。 開發(fā)發(fā)揮作用、線上會自動屏蔽【StrictMode】

作用1:識別不安全的生命周期

React開發(fā)中使用嚴格模式的作用主要是為了識別 Class組件中一些逐漸廢棄的組件生命周期,還有引用的第三方組件庫中的一些生命周期方法。

React中使用嚴格模式,一旦發(fā)現(xiàn)有風(fēng)險的生命周期的使用就會在控制臺中提出警告

作用2:關(guān)于使用過時字符串 ref API 的警告

refs為字符串的危害??

如下圖:

作用3:關(guān)于使用廢棄的 findDOMNode 方法的警告

findDOMNode 也可用于 class組件,但它違反了抽象原則,它使得父組件需要單獨渲染子組件。

它會產(chǎn)生重構(gòu)危險,你不能更改組件的實現(xiàn)細節(jié),因為父組件可能正在訪問它的 DOM節(jié)點。

findDOMNode 只返回第一個子節(jié)點,但是使用 Fragments,組件可以渲染多個 DOM 節(jié)點。findDOMNode是一個只讀一次的 API。

調(diào)用該方法只會返回第一次查詢的結(jié)果。如果子組件渲染了不同的節(jié)點,則無法跟蹤此更改。因此,findDOMNode僅在組件返回單個且不可變的 DOM 節(jié)點時才有效。

作用4:檢測意外的副作用(useEffect副作用)

1.React的工作階段

  • React 分兩個階段工作:
  • 渲染階段: 會確定需要進行哪些更改,比如 DOM。在此階段,React 調(diào)用 render,然后將結(jié)果與上次渲染的結(jié)果進行比較。
  • 提交階段: 發(fā)生在當(dāng) React 應(yīng)用變化時。(對于 React DOM 來說,會發(fā)生在 React 插入,更新及刪除 DOM 節(jié)點的時候。)在此階段,React 還會調(diào)用 componentDidMount 和 componentDidUpdate 之類的生命周期方法。

2.React嚴格模式的重復(fù)調(diào)用

嚴格模式不能自動檢測到你的副作用,但它可以幫助你發(fā)現(xiàn)它們。

通過故意重復(fù)調(diào)用以下函數(shù)來實現(xiàn)的該操作:

  • class 組件的constructor、rendershouldComponentUpdate
  • 組件的生命周期方法:getDerivedStateFromProps
  • 函數(shù)組件通過使用 useState,useMemo或者useReducer

3.Tips:

嚴格模式采用故意重復(fù)調(diào)用方法(如組件的構(gòu)造函數(shù))的方式,使得這種 bug 更容易被發(fā)現(xiàn)。

作用5:檢測過時的 context API

過時的 context API 容易出錯,將在未來的主要版本中刪除。

在所有 16.x 版本中它仍然有效,但在嚴格模式下,將顯示以下警告:

解決useEffect執(zhí)行兩次(刪除嚴格模式)

代碼如下:

  //就是下面的代碼 React.StrictMode
  // <React.StrictMode>
    <App />
  // </React.StrictMode>

圖片如下:

關(guān)閉嚴格模式前,如下圖:

關(guān)閉嚴格模式后,如下圖:

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • React性能優(yōu)化系列之減少props改變的實現(xiàn)方法

    React性能優(yōu)化系列之減少props改變的實現(xiàn)方法

    這篇文章主要介紹了React性能優(yōu)化系列之減少props改變的實現(xiàn)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • React18的useEffect執(zhí)行兩次如何應(yīng)對

    React18的useEffect執(zhí)行兩次如何應(yīng)對

    這篇文章主要給大家介紹了關(guān)于React18的useEffect執(zhí)行兩次如何應(yīng)對的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用React具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • react中事件處理與柯里化的實現(xiàn)

    react中事件處理與柯里化的實現(xiàn)

    本文主要介紹了react中事件處理與柯里化的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 利用ES6語法重構(gòu)React組件詳解

    利用ES6語法重構(gòu)React組件詳解

    這篇文章主要介紹了利用ES6語法重構(gòu)React組件的相關(guān)資料,文中通過示例代碼介紹的很詳細,對大家具有一定的參考借鑒價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • 在React項目中使用iframe嵌入一個網(wǎng)站的步驟

    在React項目中使用iframe嵌入一個網(wǎng)站的步驟

    本文介紹了如何在React項目中通過iframe嵌入百度網(wǎng)站的步驟,首先創(chuàng)建一個Baidu.js組件,并在該組件中設(shè)置iframe來加載百度,然后在App.js中引入并使用Baidu組件,還討論了因安全策略可能無法加載某些網(wǎng)站的問題,需要的朋友可以參考下
    2024-09-09
  • react-router?v6實現(xiàn)動態(tài)路由實例

    react-router?v6實現(xiàn)動態(tài)路由實例

    這篇文章主要為大家介紹了react-router?v6實現(xiàn)動態(tài)路由實例詳解,<BR>有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • React生命周期函數(shù)圖解介紹

    React生命周期函數(shù)圖解介紹

    生命周期函數(shù)指在某一時刻組件會自動調(diào)用并執(zhí)行的函數(shù)。React每個類組件都包含生命周期方法,以便于在運行過程中特定的階段執(zhí)行這些方法
    2022-11-11
  • react antd-mobile ActionSheet+tag實現(xiàn)多選方式

    react antd-mobile ActionSheet+tag實現(xiàn)多選方式

    這篇文章主要介紹了react antd-mobile ActionSheet+tag實現(xiàn)多選方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • ReactNative實現(xiàn)Toast的示例

    ReactNative實現(xiàn)Toast的示例

    這篇文章主要介紹了ReactNative實現(xiàn)Toast的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 一步步設(shè)置你的第一個Next.js項目(非常詳細!)

    一步步設(shè)置你的第一個Next.js項目(非常詳細!)

    Next.js是一個基于React的全??蚣?旨在幫助開發(fā)者構(gòu)建高性能、可擴展的Web應(yīng)用,這篇文章主要介紹了如何設(shè)置你的第一個Next.js項目的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-09-09

最新評論