React - useEffect函數的理解和使用

文章目錄

    • 一,useEffect描述
    • 二,它的執行時機
    • 三,useEffect分情況使用
      • 1,不寫第二個參數 說明監測所有state,其中一個變化就會觸發此函數
      • 2,第二個參數如果是`[]`空數組,說明誰也不監測
      • 3,第二個參數如果只傳需要監測的state,那只會根據此狀態來執行函數
      • 4,useEffect 里面return一個回調函數,相當于組件即將卸載的聲明周期
      • 5,注意

一,useEffect描述

我們知道,react 的函數組件里面沒有生命周期的,也沒有 state,沒有 state 可以用 useState 來替代,那么生命周期呢?

useEffectreact v16.8 新引入的特性。我們可以把 useEffect hook 看作是componentDidMount、componentDidUpdate、componentWillUnmounrt三個生命周期的組合。可以讓你在函數式組件中執行一些副作用操作;

一般副作用操作有:

  1. 發送ajax請求
  2. 設置訂閱 / 啟動定時器
  3. 手動更改真實DOM

二,它的執行時機

可以看做這三個生命周期函數的組合,也就是在這三個時候會執行

componentDidMount(組件已經掛載)

componentDidUpdate(組件已經更新)

componentWillUnmount(組件即將卸載)

三,useEffect分情況使用

useEffect()有兩個參數:第一個參數是要執行的回調函數,第二個參數是一個依賴項數組數組(根據需求第二個參數可選是否填寫),根據數組里的變量是否變化決定是否執行函數;

先看下面簡單的案例 ,下面會分情況討論:

useEffect.js

import React, { useState, useEffect, useRef } from "react";// 類型約定
interface interList {id: number | string; // 類型可能是number也可能是stringtext: string;done: boolean;
}
// 渲染數據
const myList: Array<interList> = [{ id: 0, text: "參觀卡夫卡博物館", done: true },{ id: 1, text: "看木偶戲", done: true },{ id: 2, text: "打卡列儂墻", done: true }
];const UseEffect: React.FC = (props: any) => {let [num, setNum] = useState(100);let [useInfo, SetUserInfo] = useState(myList);// 0,什么都不傳 就是監聽所有數據的變化useEffect(() => {console.log("我改變了-all");}); // 1,此處相當于 componentDidUpdate生命周期 組件已經更新完成useEffect(() => {console.log("我改變了");}, [num]); // 只監聽num的變化,useInfo的變化不會被監聽到// 2,此處相當于componentDidMount生命周期 組件已經掛載完成useEffect(() => {console.log("componentDidMount");console.log("可以拿到num的值:", num);}, []);// 3,此處相當于 componentWillUnmount生命周期 組件即將卸載useEffect(() => {// 返回一個回調函數return () => {console.log("組件將要卸載了");};}, []);// 其實傳不傳空數組或不是空數組,useEffect函數里面的回調都會執行一次,也就是說componentWillUnmount這個生命周期頁面進來就會執行// useEffect 這個hoosk也是可以寫多個的,盡量不同的處理寫在不同useEffect里面// 點擊改變用戶信息const change = () => {// react 建議不要更改原數組 返回一個數組的拷貝const newList = [...useInfo, { id: 3, text: "優菈", done: false }];SetUserInfo(newList);};// 點擊加一const add = () => {setNum(++num);};const lis = useInfo.map((item, index) => {return (<li key={index}>{index}:{item.text}</li>);});return (<><div><h3>userEffect 副作用hooks函數</h3><br /><button onClick={add}>點擊加一</button><p>{num}</p><br /><button onClick={change}>改變用戶信息</button><ul>{lis}</ul></div></>);
};
export default UseEffect;

效果圖:
在這里插入圖片描述

上面代碼實現的效果很簡單,兩個按鈕分別改變各自數據的狀態,狀態的改變會觸發 useEffect函數的執行,第二個參數的傳參影響著此函數的變化,所以下面進行分情況討論:

1,不寫第二個參數 說明監測所有state,其中一個變化就會觸發此函數

若不寫第二個參數,函數操作每次都會執行 useEffect(method)監測所有state,相當于 componentDidUpdate生命周期 - 組件已經更新完成。

   import {useEffect } from "react";useEffect(() => {console.log("我改變了-all");}); // 監聽所有數據的變化

2,第二個參數如果是[]空數組,說明誰也不監測

第二個參數如果是[]空數組,說明誰也不監測,此時useEffect回調函數的作用就相當于
componentDidMount生命周期 - 組件已經掛載完成;

  // 2,此處相當于componentDidMount生命周期 組件已經掛載完成useEffect(() => {console.log("componentDidMount");console.log("可以拿到num的值:", num);}, []);

3,第二個參數如果只傳需要監測的state,那只會根據此狀態來執行函數

如果第二個參數中的數組只傳了 num ,說明只有 num改變時,才會觸發此useEffect回調函數,相當于對此數據的監聽。

  // 1,此處相當于 componentDidUpdate生命周期 組件已經更新完成useEffect(() => {console.log("num改變了");}, [num]); // 只監聽num的變化

當然數組里面也可以寫多個([num,userInfo]),同時監聽多個數據的變化。

4,useEffect 里面return一個回調函數,相當于組件即將卸載的聲明周期

這句話什么意思呢?
通常,組件是有卸載的生命周期的,使用useEffect 函數只需在里面return一個回調函數,這個回調函數就相當于componentWillUnmount 聲明周期,可以在里面清除創建的訂閱或計時器 ID 等資源。

  // 3,此處相當于 componentWillUnmount生命周期 組件即將卸載useEffect(() => {// 返回一個回調函數return () => {console.log("組件將要卸載了");};}, []);

這里傳了空數組說明我不想監聽數據的變化,只想在卸載組件的時候執行該邏輯;

5,注意

其實第二個傳不傳空數組或不是空數組,useEffect函數里面的回調都會執行一次,也就是說頁面進來就會自動執行componentWillUnmount這個生命周期;

useEffect函數 這個hoosk也是可以寫多個的,盡量不同的業務處理寫在不同useEffect里面;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36034.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36034.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36034.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

gRPC vs REST:創建API的方法比較

本文對gRPC和REST的特征和區別進行了介紹&#xff0c;這可能是當今創建API最常用的兩種方法。 文章目錄 一、gRPC的介紹 二、什么是REST&#xff1f; 三、什么是gRPC? 四、gRPC和REST的比較 &#xff08;1&#xff09;底層HTTP協議 &#xff08;2&#xff09;支持的數據…

平替 Docker - 玩轉容器新利器 Podman Desktop (視頻)

《OpenShift 4.x HOL教程匯總》 在 podman-desktop 1.2.1 podman 4.4 環境中驗證。 文章目錄 什么是 podman 和 podman-desktop安裝 podman 和 podman-desktop 基本環境Image、Container 和 Pod 的基本操作拉取 Image運行 Container 將 Pod 部署到 Kubernetes安裝 Kind 擴展插…

Python爬蟲——selenium_元素定位

元素定位&#xff1a;自動化要做的就是模擬鼠標和鍵盤來操作這些元素&#xff0c;點擊&#xff0c;輸入等等。操作這些元素前首先要找到它們&#xff0c;WebDriver提供很多定位元素的方法 from selenium import webdriver# 創建瀏覽器對象 path files/chromedriver.exe brows…

【安全】淺談信息安全

信息安全 理解信息安全&#xff0c;要從“信息”、“安全”兩個角度入手。 信息 信息是對客觀世界的反映&#xff0c;表現客觀事物的運動狀態和變化的實質內容。 信息具有可識別、可傳載、可共享、可度量的基本特征。 信息系統 信息系統是獲取&#xff08;收集&#xff0…

中心對稱鏈表

文章目錄 1 題目2 思路2.1 思路一2.2 思路二2.3 考點2.4 擴展 3 實現3.1 思路13.2 思路23.3 完整例子 1 題目 已知長度為n&#xff08;n>1&#xff09;的單鏈表&#xff0c;表頭指針為L&#xff0c;結點結構由data和next兩個域構成&#xff0c;其中data域為字符型&#xff…

Linux RPM包安裝、卸載和升級(rpm命令)詳解

(轉載請刪除括號里的內容) 下面講解一下&#xff0c;如何使用 rpm 命令對 RPM 二進制包進行安裝、卸載和升級操作。我們以安裝 apache 程序為例。 RPM包默認安裝路徑 通常情況下&#xff0c;RPM 包采用系統默認的安裝路徑&#xff0c;所有安裝文件會按照類別分散安裝到下表所…

優漫動游 大廠需要什么樣的ui設計師呢?

通常來說大公司UI設計的流程主要是這樣的&#xff1a;創意-頭腦風暴-策劃方案-交互設計&評審-美術設計&評審-開發實施&#xff0c;不過實際上大多數公司都有自己的一套流程&#xff0c;源于公司的基因、公司組織體系、公司領導風格。一起了解大廠需要什么樣的ui設計師呢…

谷粒商城第十一天-品牌管理中關聯分類

目錄 一、總述 二、前端部分 1. 調整查詢調用 2. 關聯分類 三、后端部分 四、總結 一、總述 之前是在商品的分類管理中直接使用的若依的逆向代碼 有下面的幾個問題&#xff1a; 1. 表格上面的參數填寫之后&#xff0c;都是按照完全匹配進行搜索&#xff0c;沒有模糊匹配…

nodejs實現前后端websocket通信+心跳示例

nodejs后端代碼 server.js //需要安裝ws模塊 npm install ws const WebSocket require("ws") const port 8085const ws new WebSocket.Server({port})ws.on("connection", (socket) > {socket.on("message",(message) > {const da…

自定義hook之首頁數據請求動作封裝 hooks

本例子實現了自定義hook之首頁數據請求動作封裝 hooks&#xff0c;具體代碼如下 export type OrganData {dis: Array<{ disease: string; id: number }>;is_delete: number;name: string;organ_id: number;parent_id: number;sort: number; }; export type SwiperData …

【STM32】簡介

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介紹&#xff1a;"謓澤"正在路上朝著"攻城獅"方向"前進四" &#x1f50e;&#x1f3c5; 榮譽&#xff1a;2021|2022年度博客之星物聯網與嵌入式開發TOP5|TOP4、2021|2022博客之星T…

(2)linux虛擬機配置中文輸入法和如何下載軟件

&#xff08;一&#xff09;配置中文輸入法&#xff1a; 1、sudo apt-get install fcitx&#xff0c;安裝fcitx框架&#xff0c;安裝完成之后&#xff0c;選擇該框架 2、接下來輸入sudo apt-get install fcitx fcitx-googlepinyin&#xff0c;安裝谷歌輸入法之后&#xff0c;重…

WebSocket與消息推送

B/S結構的軟件項目中有時客戶端需要實時的獲得服務器消息&#xff0c;但默認HTTP協議只支持請求響應模式&#xff0c;這樣做可以簡化Web服務器&#xff0c;減少服務器的負擔&#xff0c;加快響應速度&#xff0c;因為服務器不需要與客戶端長時間建立一個通信鏈接&#xff0c;但…

Windows - UWP - 網絡不好的情況下安裝(微軟商店)MicrosoftStore的應用

Windows - UWP - 網絡不好的情況下安裝&#xff08;微軟商店&#xff09;MicrosoftStore的應用 前言 UWP雖然幾乎被微軟拋棄了&#xff0c;但不得不否認UWP應用給用戶帶來的體驗。沙箱的運行方式加上微軟的審核&#xff0c;用戶使用起來非常放心&#xff0c;并且完美契合Wind…

聚類與回歸

聚類 聚類屬于非監督式學習&#xff08;無監督學習&#xff09;&#xff0c;往往不知道因變量。 通過觀察學習&#xff0c;將數據分割成多個簇。 回歸 回歸屬于監督式學習&#xff08;有監督學習&#xff09;&#xff0c;知道因變量。 通過有標簽樣本的學習分類器 聚類和…

前端實現文件預覽功能

前端實現文件預覽功能 ? 需求&#xff1a;實現一個在線預覽pdf、excel、word、圖片等文件的功能。 介紹&#xff1a;支持pdf、xlsx、docx、jpg、png、jpeg。 以下使用Vue3代碼實現所有功能&#xff0c;建議以下的預覽文件標簽可以在外層包裹一層彈窗。 ? 圖片預覽 iframe標簽…

前端雜項-個人總結八股文的背誦方案

個人總結八股文的背誦方案 URL到顯示網頁的過程 瀏覽器解析URL&#xff0c;獲取協議&#xff0c;主機名&#xff0c;端口號&#xff0c;路徑等信息&#xff0c;并通過DNS查詢將主機名轉換為對應的IP地址瀏覽器與服務器建立TCP&#xff0c;進行三次握手。瀏覽器向服務器發送HT…

枚舉緩存工具

此文章為筆記&#xff0c;為閱讀其他文章的感受、補充、記錄、練習、匯總&#xff0c;非原創&#xff0c;感謝每個知識分享者。 文章目錄 1. 背景2. 枚舉緩存3. 樣例展示4. 性能對比5. 總結 本文通過幾種樣例展示如何高效優雅的使用java枚舉消除冗余代碼。 1. 背景 枚舉在系統…

不需要用@Param注解與需要用@Param注解的情況

不需要用Param注解&#xff1a; 1.只有一個參數時&#xff0c;不需要用Param注解。此時在不使用Parma注解的情況下&#xff0c;sql語句中的參數占位符名稱直接使用任何名稱均可&#xff1b; 2.方法參數是引用數據類型的情況下&#xff0c;不需要用Param注解。 需要用Param注…

QT生成Word PDF文檔

需求&#xff1a;將軟件處理的結果保存為一個報告文檔&#xff0c;文檔中包含表格、圖片、文字&#xff0c;格式為word的.doc和.pdf。生成word是為了便于用戶編輯。 開發環境&#xff1a;qt4.8.4vs2010 在qt的官網上對于pdf的操作介紹如下&#xff1a;http://qt-project.org/…