最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React useEffect的理解與使用

 更新時間:2021年04月19日 10:47:58   作者:RedCHr  
這篇文章主要介紹了React useEffect的理解與使用,幫助大家更好的理解和學習使用React,感興趣的朋友可以了解下

React16.8新增的useEffec這個hook函數就是處理副作用的。

所謂的“副作用”,舉個通俗一點的例子,假如感冒了本來吃點藥就沒事了,但是吃了藥發(fā)現身體過敏了,而這個“過敏”就是副作用。

放到React中,本來只是想渲染DOM展示到頁面上,但除了DOM之外還有數據,而這些數據必須從外部的數據源中獲取,這個“獲取外部數據源”的過程就是副作用。

useEffect怎么用可以參考官網給出的例子,這里主要針對使用useEffect過程中遇到的問題進行總結。

避免重復循環(huán)渲染

利用useEffect接收一個數組作為第二個參數,將第二個參數作為dependence,每次渲染完DOM執(zhí)行副作用函數時都會淺比較dependence渲染前后的值是否一致,不一致就執(zhí)行副作用,反之就不執(zhí)行;如果該dependence為一個空數組[],即沒有傳入比較變化的變量,則比較結果永遠都保持不變,那么副作用邏輯就只能執(zhí)行一次。

useEffect(() => {
  setTimeout(() => {    
        setCounter(counter + 1);  
    }, 300)
}, []);

初此之外,如果我們還想通過點擊刷新按鈕實現獲取外部數據但又不想造成死循環(huán),那么可以通過一個變量作為“開關”,在實現目的的同時做到避免循環(huán)渲染DOM。

畫動圖太麻煩,各位看注釋腦補😂

function App() {  const [count, setCount] = useState(0);  const [loading, setLoading] = useState(true); // loading作為開關  useEffect(() => {    if (loading) { // 注意這里只有當loading為true時才執(zhí)行      setTimeout(() => {        setCount(count + 1);        setLoading(!loading); // 改變loading值      });    }  }, [loading]); // loading在這里作為dependence
  // 第一次DOM渲染完成后,loading為true,執(zhí)行副作用函數,count值變?yōu)?,loading變?yōu)閒alse,由于
  // 改變了state的值,會update,組件會再次render,但此時loading為false,不會執(zhí)行setTimeout,
  // 避免了循環(huán)

  // 當點擊Refresh刷新,loading由上一次的false變?yōu)榱藅rue,函數執(zhí)行一次update
  // DOM更新完后執(zhí)行useEffect,因為loading已經為true了,所以副作用函數可執(zhí)行,count從1變?yōu)?,
  // loading又從true變?yōu)閒alse,就這樣交替進行。。。
  return (    <div>      <h3>{count}</h3>      <button        onClick={() => {          setLoading(true);        }}      >        Refresh      </button>    </div>  );}

關于副作用的清除

useEffect可以返回一個函數來作為清除副作用。

  useEffect(() => {    
    ChatAPI.subscribeToFriendStatus(props.id, handleStatusChange);  
    function clear(){
        ChatAPI.unsubscribeFromFriendStatus(props.id, handleStatusChange);
    }  
    return clear;
});

這里會涉及到useEffect執(zhí)行和銷毀的過程:

  1. 傳入props.id = 1
  2. 組件渲染
  3. DOM渲染完成,執(zhí)行副作用函數,返回清除副作用函數clear,命名為clear1
  4. 傳入props.id=2
  5. 組件渲染
  6. DOM渲染完成,執(zhí)行clear1
  7. 副作用函數執(zhí)行并返回另一個clear函數,命名為clear2
  8. 組件銷毀,clear2執(zhí)行

由此可推測出副作用清除函數的特征:

  • 每次副作用執(zhí)行都會返回一個清除函數
  • 清除函數會在下一次副作用函數執(zhí)行之前(DOM渲染完成之后)執(zhí)行
  • 組件銷毀也會執(zhí)行一次清除函數

從打印出的count值也可以看出,清除函數會在下一次副作用函數執(zhí)行之前執(zhí)行,即在清除函數里的count值是上一次緩存的count值:

進一步思考,clear1執(zhí)行的時候,訪問了props.id,那么這個id值是1還是2呢?

這里就涉及到閉包的知識概念了,因為useEffect返回的是個函數,在執(zhí)行時產生了一個閉包,根據閉包的相關定義,返回的clear函數能訪問自身作用域外的變量,當組件第一次渲染時傳入id=1,此時的clear函數中的props.id值為1。

以上就是React useEffect的理解與使用的詳細內容,更多關于React useEffect的資料請關注腳本之家其它相關文章!

相關文章

  • webpack手動配置React開發(fā)環(huán)境的步驟

    webpack手動配置React開發(fā)環(huán)境的步驟

    本篇文章主要介紹了webpack手動配置React開發(fā)環(huán)境的步驟,webpack手動配置一個獨立的React開發(fā)環(huán)境, 開發(fā)環(huán)境完成后, 支持自動構建, 自動刷新, sass語法 等功能...感興趣的小伙伴們可以參考一下
    2018-07-07
  • React文件名和目錄規(guī)范最佳實踐記錄(總結篇)

    React文件名和目錄規(guī)范最佳實踐記錄(總結篇)

    React在使用時非常靈活,如果沒有一個規(guī)范約束項目,在開發(fā)過程中會非?;靵y,本文將介紹幾個優(yōu)秀的規(guī)范,介紹文件名和目錄前,需要先簡述一下幾種通用的類型,用來區(qū)分文件的功能,感興趣的朋友一起看看吧
    2022-05-05
  • react搭建環(huán)境時執(zhí)行npm start報錯start: 'react-scripts start'的解決

    react搭建環(huán)境時執(zhí)行npm start報錯start: 'react-scripts&

    這篇文章主要介紹了react搭建環(huán)境時執(zhí)行npm start報錯start: 'react-scripts start'的解決方案,具有很好的參考價值,希望杜對大家有所幫助,
    2023-10-10
  • 一文學會使用Remix寫API接口

    一文學會使用Remix寫API接口

    這篇文章主要為大家介紹了一文學會Remix寫API接口實現示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • react-navigation 如何判斷用戶是否登錄跳轉到登錄頁的方法

    react-navigation 如何判斷用戶是否登錄跳轉到登錄頁的方法

    本篇文章主要介紹了react-navigation 如何判斷用戶是否登錄跳轉到登錄頁的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • React 實現井字棋的示例代碼

    React 實現井字棋的示例代碼

    本文主要介紹了React 實現井字棋,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-07-07
  • 深入理解React Native核心原理(React Native的橋接(Bridge)

    深入理解React Native核心原理(React Native的橋接(Bridge)

    這篇文章主要介紹了深入理解React Native核心原理(React Native的橋接(Bridge),本文重點給大家介紹React Native的基礎知識及實現原理,需要的朋友可以參考下
    2021-04-04
  • React Native 搭建開發(fā)環(huán)境的方法步驟

    React Native 搭建開發(fā)環(huán)境的方法步驟

    本篇文章主要介紹了React Native 搭建開發(fā)環(huán)境的方法步驟,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • react純函數組件setState更新頁面不刷新的解決

    react純函數組件setState更新頁面不刷新的解決

    在開發(fā)過程中,經常遇到組件數據無法更新,本文主要介紹了react純函數組件setState更新頁面不刷新的解決,感興趣的可以了解一下
    2021-06-06
  • React Hooks獲取數據實現方法介紹

    React Hooks獲取數據實現方法介紹

    這篇文章主要介紹了react hooks獲取數據,文中給大家介紹了useState dispatch函數如何與其使用的Function Component進行綁定,實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-10-10

最新評論

博白县| 九江县| 蒙城县| 赤水市| 西乌珠穆沁旗| 讷河市| 龙门县| 朝阳县| 高雄市| 富宁县| 浠水县| 七台河市| 米易县| 瓦房店市| 长垣县| 乌鲁木齐县| 华蓥市| 河池市| 夏河县| 定西市| 五家渠市| 郸城县| 土默特左旗| 赣榆县| 方正县| 仙桃市| 龙州县| 济源市| 梨树县| 临桂县| 内乡县| 东至县| 时尚| 麻城市| 轮台县| 海林市| 香河县| 尼木县| 科尔| 房产| 松溪县|