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

React useEffect的理解與使用

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

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

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

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

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

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

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

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

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

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

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

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

關(guān)于副作用的清除

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

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

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

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

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

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

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

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

相關(guān)文章

  • React跨端動態(tài)化之從JS引擎到RN落地詳解

    React跨端動態(tài)化之從JS引擎到RN落地詳解

    這篇文章主要為大家介紹了React跨端動態(tài)化之從JS引擎到RN落地,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • React使用api的方式封裝彈窗的示例代碼

    React使用api的方式封裝彈窗的示例代碼

    在現(xiàn)代開發(fā)中的彈窗樣式,經(jīng)常會是底部一個叉號樣式的彈窗,但是目前組件庫中并無類似彈窗組件,本文小編給大家介紹了React使用api的方式封裝彈窗的示例,感興趣的小伙伴跟著小編一起來看看吧
    2024-09-09
  • 使用react在修改state中的數(shù)組和對象數(shù)據(jù)的時候(setState)

    使用react在修改state中的數(shù)組和對象數(shù)據(jù)的時候(setState)

    這篇文章主要介紹了使用react在修改state中的數(shù)組和對象數(shù)據(jù)的時候(setState),具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • react中useEffect函數(shù)的詳細用法(最新推薦)

    react中useEffect函數(shù)的詳細用法(最新推薦)

    useEffect是React中的一個Hook,用于在函數(shù)組件中處理副作用(如數(shù)據(jù)獲取、訂閱、手動更改 DOM 等),useEffect屬于組件的生命周期方法,下面通過本文給大家分享react中useEffect函數(shù)的詳細用法,感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • JavaScript的React Web庫的理念剖析及基礎(chǔ)上手指南

    JavaScript的React Web庫的理念剖析及基礎(chǔ)上手指南

    這篇文章主要介紹了JavaScript的React Web庫的理念剖析及基礎(chǔ)上手指南,React Web的目的即是把本地的React Native應(yīng)用程序項目變?yōu)閃eb應(yīng)用程序,需要的朋友可以參考下
    2016-05-05
  • react如何用懶加載減少首屏加載時間

    react如何用懶加載減少首屏加載時間

    這篇文章主要介紹了react如何利用懶加載減少首屏加載時間,幫助大家更好的理解和學習使用react,感興趣的朋友可以了解下
    2021-04-04
  • React ts模式使用http-proxy-middleware代理時訪問報404問題

    React ts模式使用http-proxy-middleware代理時訪問報404問題

    這篇文章主要介紹了React ts模式使用http-proxy-middleware代理時訪問報404問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • React?component.forceUpdate()強制重新渲染方式

    React?component.forceUpdate()強制重新渲染方式

    這篇文章主要介紹了React?component.forceUpdate()強制重新渲染方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 解析React?ref?命令代替父子組件的數(shù)據(jù)傳遞問題

    解析React?ref?命令代替父子組件的數(shù)據(jù)傳遞問題

    這篇文章主要介紹了React?-?ref?命令為什么代替父子組件的數(shù)據(jù)傳遞,使用?ref?之后,我們不需要再進行頻繁的父子傳遞了,子組件也可以有自己的私有狀態(tài)并且不會影響信息的正常需求,這是為什么呢?因為我們使用了?ref?命令的話,ref是可以進行狀態(tài)的傳輸
    2022-08-08
  • React useCallback使用教程

    React useCallback使用教程

    useCallback是react中比較重要的一個hook,useCallback 用來返回一個函數(shù),在父子組件傳參或者通用函數(shù)封裝中,起到舉足輕重的作用
    2023-01-01

最新評論