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

React中的useEffect(副作用)介紹

 更新時間:2024年01月04日 08:44:35   作者:前端小草籽  
這篇文章主要介紹了React中的useEffect(副作用),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

useEffect(副作用)介紹

useEffect是用來使函數(shù)組件也可以進行副作用操作的。

那么什么是副作用呢?

函數(shù)的副作用就是函數(shù)除了返回值外對外界環(huán)境造成的其它影響。

舉個例子,假如我們每次執(zhí)行一個函數(shù),該函數(shù)都會操作全局的一個變量,那么對全局變量的操作就是這個函數(shù)的副作用。而在React的世界里,我們的副作用大體可以分為兩類,一類是調用瀏覽器的API,例如使用addEventListener來添加事件監(jiān)聽函數(shù)等,另外一類是發(fā)起獲取服務器數(shù)據(jù)的請求,例如當用戶組件掛載的時候去異步獲取用戶的信息等。

react官方的原話:

如果你熟悉 React class 的生命周期函數(shù),你可以把 useEffect Hook 看做 componentDidMount,componentDidUpdate 和 componentWillUnmount 這三個函數(shù)的組合。

  • componentDidMount 組件掛載
  • componentDidUpdate 組件更新
  • componentWillUnmount 組件將要摧毀

語法:

import {useEffect} from "react"
useEffect(() => {
  /** 執(zhí)行邏輯 */
  }, dependencies)  //dependencies是一個數(shù)組,是可選的
 
//或者:
useEffect(effect?=>clean?, dependencies?)

 useEffect的第一個參數(shù) effect 是要執(zhí)行的副作用函數(shù),它可以是任意的用戶自定義函數(shù),用戶可以在這個函數(shù)里面操作一些瀏覽器的API或者和外部環(huán)境進行交互,網(wǎng)絡請求等,這個函數(shù)會在每次組件渲染完成之后被調用。

useEffect可以有一個返回值,返回一個函數(shù),系統(tǒng)在組件重新渲染之前調用,用于清除副作用(比如說副作用是定時器,return里面就可以寫清除定時器的代碼)。它第二個參數(shù)dependencies(依賴項)來限制該副作用的執(zhí)行條件  

useEffect(副作用)各種寫法的調用時刻

1.寫法一:沒有依賴項時

useEffect所在組件每次渲染(包括首次)時都要調用:組件中任何變化都會執(zhí)行(eg:useState解構出的state改了就會引發(fā)組件重新渲染,父組件給子組件傳遞屬性的值改變,子組件中的useEffect就會執(zhí)行)

  //沒有依賴項
  useEffect(()=>{
    console.log('組件每次渲染時都要調用(頁面每次刷新)');
  })

組件生命周期里面有一種生命周期父組件給子組件傳新的屬性就會調用的生命周期函數(shù),useEffect寫法一就可以替代。

組件自身狀態(tài)變化會調用beforeupdateupdated,useEffect寫法一就可以替代。

父組件給子組件傳值:

2.寫法二:依賴項中有監(jiān)聽的值時

根據(jù)依賴項中監(jiān)聽的變量是否變化決定是否執(zhí)行副作用,變了就執(zhí)行,不變就不執(zhí)行。

    //依賴項中有值時
    //頁面首次渲染和父組件給子組件傳的屬性值和子組件自身的值改變(依賴項改變才會打印)
    useEffect(() => {
        console.log('頁面首次渲染和依賴項改變的時候才會打印');
    },[num,props.title])

3.寫法三:依賴項為空數(shù)組時

相當于Vue生命周期函數(shù)mounted,也就是頁面首次渲染(掛載)后,后面不管組件中值咋改變都不會執(zhí)行了,除非該組件銷毀了再重新掛載時才會執(zhí)行。

    useEffect(() => {
        console.log('頁面首次渲染');
    },[])

4.寫法四:清除副作用寫法

(假如副作用是一個定時器,清除定時器,如果不清的話,會出現(xiàn)內存泄漏)

    useEffect(() => {
        let timer = setInterval(()=>{
            console.log(66666);
        },1000)
        return ()=>{
            //當組件下一次渲染前,執(zhí)行這個函數(shù):清除副作用(計時器就是一種副作用)
            console.log('當組件下一次渲染前,執(zhí)行這個函數(shù):清除副作用');
            clearInterval(timer);
        }
    })//這里沒寫依賴項,所以頁面中的值改變就會刷新,比如useState解構出的state改變

問題:副作用函數(shù)不會有緩存,那為什么在副作用函數(shù)useEffect里面寫了定時器,頁面(組件)刷新之后上一個定時器沒有清除?

就非要寫return 返回一個函數(shù)去清除副作用(定時器)

5.寫法五:依賴項是一個函數(shù)的時候

    let fn = ()=>{
        console.log(11111111);
    }
    useEffect(() => {
        console.log('此組件渲染時,就會運行(包括首次渲染)');
        // 該組件渲染時(包括首次渲染),就會執(zhí)行副作用
        let timer = setInterval(()=>{
            console.log(66666);
        },1000)
        return ()=>{
            //而當該組件下一次運行(渲染)時,才會執(zhí)行清除副作用函數(shù)(第一次渲染不執(zhí)行(組件首次渲染時),下一次渲染才執(zhí)行)
            console.log('當組件下一次渲染前,執(zhí)行這個函數(shù):清除副作用');
            clearInterval(timer);
        }
    },[fn])

分析:當依賴項 fn 函數(shù)運行的時候,副作用函數(shù)才會運行(先執(zhí)行副作用函數(shù)的return返回的函數(shù),把上一次渲染生成的定時器清除,才會執(zhí)行副作用函數(shù),重新生成一個定時器),但是return返回的函數(shù)不一定運行,因為return返回的函數(shù)必須要是在該組件下一次渲染時,才會執(zhí)行。因為fn函數(shù)雖然執(zhí)行,但是并沒有引起組件重新渲染,所以并不會執(zhí)行return返回的函數(shù)。

缺點是:函數(shù)組件刷新時,函數(shù)fn又會重新生成一模一樣的,沒必要,會占用內存。有沒有一種技術,在組件刷新時,這種像fn函數(shù)的,不重新生成,就用原來內存中的fn,就不用去重新開辟內存空間去生成函數(shù)fn。所以就用到了useCallback

注意點

1.

    //這種沒依賴項
    let [data,setData] = useState('');
    useEffect(()=>{
        //這里可以進行請求后臺數(shù)據(jù),但是不能通過setData()將請求回來的數(shù)據(jù)把頁面刷新
        //會陷入死循環(huán),頁面一刷新 useEffect就會執(zhí)行,就會請求后臺數(shù)據(jù),請求回來的數(shù)據(jù)又
        //通過setData()導致頁面數(shù)據(jù)改變然后刷新,這樣就會陷入死循環(huán)
        setData();
    })   
 
    //如果有依賴項的話,就不會陷入死循環(huán)

2.組件重新渲染時,會將那些非hook相關的數(shù)據(jù)重新生成一份,比如說,

    let [num,setNum] = useState(100);  //hook相關的數(shù)據(jù)
    let m = 100;            //普通的數(shù)據(jù)
    let arr = [100,200,900];//普通的引用數(shù)據(jù)
    let fm = ()=>{}         //普通的引用數(shù)據(jù)

以use開頭的那些hook組件刷新時不會重新生成,那些普通的數(shù)據(jù)會重新生成。

如果依賴項是這種普通的arr,fm等引用數(shù)據(jù),組件刷新時,就會重新生成,重新開辟內存空間生成,所以就會導致副作用函數(shù)執(zhí)行,所以一般副作用函數(shù)的依賴項都是父組件給子組件傳的屬性或者useState解構出的state值這些。

總結

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

相關文章

  • React生命周期方法之componentDidMount的使用

    React生命周期方法之componentDidMount的使用

    這篇文章主要介紹了React生命周期方法之componentDidMount的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • React組件傳children的方案總結

    React組件傳children的方案總結

    自定義組件的時候往往需要傳 children,由于寫法比較多樣,我就總結了一下,文中有詳細的總結內容和代碼示例,具有一定的參考價值,需要的朋友可以參考下
    2023-10-10
  • 2個奇怪的react寫法

    2個奇怪的react寫法

    大家好,我卡頌。雖然React官網(wǎng)用大量篇幅介紹最佳實踐,但因JSX語法的靈活性,所以總是會出現(xiàn)奇奇怪怪的React寫法。本文介紹2種奇怪(但在某些場景下有意義)的React寫法。也歡迎大家在評論區(qū)討論你遇到過的奇怪寫法
    2023-03-03
  • react-native 圓弧拖動進度條實現(xiàn)的示例代碼

    react-native 圓弧拖動進度條實現(xiàn)的示例代碼

    本篇文章主要介紹了react-native 圓弧拖動進度條實現(xiàn)的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • react開發(fā)教程之React 組件之間的通信方式

    react開發(fā)教程之React 組件之間的通信方式

    本篇文章主要介紹了react開發(fā)教程之React組件通信詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • 路由react-router-dom的基本使用教程

    路由react-router-dom的基本使用教程

    在React中,路由是一套映射規(guī)則,是URL路徑與組件的對應關系。使用React路由,就是配置路徑和組件的對應關系,這篇文章主要介紹了路由react-router-dom的使用,需要的朋友可以參考下
    2023-02-02
  • React中使用react-player 播放視頻或直播的方法

    React中使用react-player 播放視頻或直播的方法

    這篇文章主要介紹了React中使用react-player 播放視頻或直播,本文教大家如何使用react框架及創(chuàng)建實例的代碼,本文內容簡短給大家介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • 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?正確使用useCallback?useMemo的方式

    React?正確使用useCallback?useMemo的方式

    這篇文章主要介紹了React?正確使用useCallback?useMemo的方式,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的朋友可以參考一下
    2022-08-08
  • ReactDOM.render在react源碼中執(zhí)行原理

    ReactDOM.render在react源碼中執(zhí)行原理

    這篇文章主要為大家介紹了ReactDOM.render在react源碼中執(zhí)行原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12

最新評論

余江县| 韶山市| 六盘水市| 双辽市| 霍邱县| 黄冈市| 汝城县| 甘泉县| 衡山县| 高青县| 武宁县| 津南区| 桂东县| 顺义区| 沾益县| 蒙城县| 布拖县| 高邑县| 黄冈市| 仪征市| 井冈山市| 南部县| 绥芬河市| 永定县| 昌乐县| 曲麻莱县| 泗洪县| 景德镇市| 祥云县| 景谷| 台前县| 商水县| 榆中县| 栖霞市| 淮南市| 旌德县| 康保县| 拉萨市| 边坝县| 哈尔滨市| 阜康市|