目錄
useEffecf基本上使用
#清除副作用(Effect)" >#清除副作用(Effect)
# #使用多個useEffect" ># #使用多個useEffect
##useEffect效能最佳化" >##useEffect效能最佳化
首頁 web前端 js教程 淺析React Hook中useEffecfa函數的使用

淺析React Hook中useEffecfa函數的使用

Nov 14, 2022 pm 08:02 PM
react react hook

這篇文章跟大家介紹React Hook中的useEffecfa函數,聊聊useEffecfa函數的使用細節,希望對大家有幫助!

淺析React Hook中useEffecfa函數的使用

useEffect的詳細解析

useEffecf基本上使用

#書接上文, 上一篇文章我們講解了State Hook, 我們已經可以透過這個hook在函數式元件中定義state。 【相關推薦:Redis影片教學程式影片

我們知道在類別元件中是可以有生命週期函數的, 那麼如何在函數元件中定義類似生命週期這些函數呢?

Effect Hook 可以讓你來完成一些類似class中生命週期的功能;

事實上,類似網路請求、手動更新DOM、一些事件的監聽,都是React更新DOM的一些副作用(Side Effects);

所以對於完成這些功能的Hook被稱之為Effect Hook;

假如我們現在有一個需求:頁面中的title總是顯示counter的數字,分別使用class元件和Hook實作:

類元件實作

import React, { PureComponent } from 'react'

export class App extends PureComponent {
  constructor() {
    super()

    this.state = {
      counter: 100
    }
  }

  // 进入页面时, 标题显示counter
  componentDidMount() {
    document.title = this.state.counter
  }

  // 数据发生变化时, 让标题一起变化
  componentDidUpdate() {
    document.title = this.state.counter
  }

  render() {
    const { counter } = this.state

    return (
      <div>
        <h2>{counter}</h2>
        <button onClick={() => this.setState({counter: counter+1})}>+1</button>
      </div>
    )
  }
}

export default App
登入後複製

函數元件加Hook的實作:

  • 透過useEffect這個Hook,可以告訴React需要在渲染後執行某些動作;
  • useEffect要求我們傳入一個回呼函數,在React執行完更新DOM操作之後(也就是元件被渲染完成後),就會回調這個函數;
  • 預設情況下,無論是第一次渲染之後,還是每次更新之後,都會執行這個回調函數; 一般情況下我們在該回調函數中都是編寫副作用的操作(例如網絡請求, 操作DOM, 事件監聽)

因此需要注意的是, 有許多說法說useEffect就是用來模擬生命週期的, 其實並不是; useEffect可以做到模擬生命週期, 但是他主要的作用是用來執行副作用的

import React, { memo, useEffect, useState } from &#39;react&#39;

const App = memo(() => {
  const [counter, setCounter] = useState(200)

  // useEffect传入一个回调函数, 在页面渲染完成后自动执行
  useEffect(() => {
    // 一般在该回调函数在编写副作用的代码(网络请求, 操作DOM, 事件监听)
    document.title = counter
  })

  return (
    <div>
      <h2>{counter}</h2>
      <button onClick={() => setCounter(counter+1)}>+1</button>
    </div>
  )
})

export default App
登入後複製

#清除副作用(Effect)

在class元件的編寫過程中,某些副作用的程式碼,我們需要在componentWillUnmount中進行清除:

例如我們之前的事件匯流排或Redux中手動呼叫subscribe;

都需要在componentWillUnmount有對應的取消訂閱;

Effect Hook透過什麼方式來模擬componentWillUnmount呢?

#useEffect傳入的回呼函數A本身可以有一個回傳值,這個回傳值是另外一個回呼函數B:

type EffectCallback = () = > (void | (() => void | undefined));

為什麼要在effect 中回傳一個函數?

這是effect 可選的清除機制。每個effect 都可以傳回一個清除函數;

如此可以將新增和移除訂閱的邏輯放在一起;

它們都屬於effect 的一部分;

React 何時清除effect?

#React 會在元件更新和卸載的時候執行清除操作, 將上一次的監聽取消掉,只留下目前的監聽;

正如之前學到的,effect 在每次渲染的時候都會執行;

import React, { memo, useEffect } from &#39;react&#39;

const App = memo(() => {
  useEffect(() => {
    // 监听store数据发生改变
    const unsubscribe = store.subscribe(() => {

    })

    // 返回值是一个回调函数, 该回调函数在组件重新渲染或者要卸载时执行
    return () => {
      // 取消监听操作
      unsubscribe()
    }
  })

  return (
    <div>
      <h2>App</h2>
    </div>
  )
})

export default App
登入後複製

# #使用多個useEffect

使用Hook的其中一個目的就是解決class中生命週期經常將很多的邏輯放在一起的問題:

例如網路請求、事件監聽、手動修改DOM,這些往往都會放在componentDidMount中;

一個函數元件中可以使用多個Effect Hook,我們可以將邏輯分離到不同的useEffect中:

import React, { memo, useEffect } from &#39;react&#39;

const App = memo(() => {
  // 监听的useEffect
  useEffect(() => {
    console.log("监听的代码逻辑")

    return () => {
      console.log("取消的监听代码逻辑")
    }
  })

  // 发送网络请求的useEffect
  useEffect(() => {
    console.log("网络请求的代码逻辑")
  })

  // 操作DOM的useEffect
  useEffect(() => {
    console.log("操作DOM的代码逻辑")
  })

  return (
    <div>
      App
    </div>
  )
})

export default App
登入後複製

Hook允許我們按照程式碼的用途分離它們,而不是像生命週期函數那樣, 將很多邏輯放在一起:

#React將依照effect 宣告的順序

依序呼叫元件中的每一個effect;


##useEffect效能最佳化

預設情況下,useEffect的回呼函數會在每次渲染時都重新執行,但這會導致兩個問題

:

某些程式碼我們只是希望執行一次即可(
例如網路請求, 元件第一次渲染中執行一次即可, 不需要執行多次

),類似於類別元件中的componentDidMount和componentWillUnmount中完成的事情;另外,多次執行也會導致一定的效能問題;

我們如何決定useEffect在什麼時候應該執行和什麼時候不應該執行呢?

useEffect其實有兩個參數:
  • 参数一: 执行的回调函数, 这个参数我们已经使用过了不再多说;
  • 参数二: 是一个数组类型, 表示 该useEffect在哪些state发生变化时,才重新执行;(受谁的影响才会重新执行)

案例练习:

受count影响的Effect;

import React, { memo, useEffect, useState } from &#39;react&#39;

const App = memo(() => {
  const [counter, setCounter] = useState(100)
  
  // 发送网络请求的useEffect, 只有在counter发生改变时才会重新执行
  useEffect(() => {
    console.log("网络请求的代码逻辑")
  }, [counter])

  return (
    <div>
      <h2 onClick={() => setCounter(counter+1)}>{counter}</h2>
    </div>
  )
})

export default App
登入後複製

但是,如果一个函数我们不希望依赖任何的内容时,也可以传入一个空的数组 []:

那么这里的两个回调函数分别对应的就是componentDidMount和componentWillUnmount生命周期函数了;

import React, { memo, useEffect, useState } from &#39;react&#39;

const App = memo(() => {
  const [counter, setCounter] = useState(100)
  
  // 传入空数组表示不受任何数据依赖
  useEffect(() => {
    // 此时传入的参数一这个回调函数: 相当于componentDidMount
    console.log("监听的代码逻辑")

    // 参数一这个回调函数的返回值: 相当于componentWillUnmount
    return () => {
      console.log("取消的监听代码逻辑")
    }
  }, [])

  return (
    <div>
      <h2 onClick={() => setCounter(counter+1)}>{counter}</h2>
    </div>
  )
})

export default App
登入後複製

总结: useEffect可以模拟之前的class组件的生命周期(类似而不是相等), 并且它比原来的生命周期更加强大, 青出于蓝而胜于蓝

更多编程相关知识,请访问:编程教学!!

以上是淺析React Hook中useEffecfa函數的使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

React前後端分離指南:如何實作前後端的解耦與獨立部署 React前後端分離指南:如何實作前後端的解耦與獨立部署 Sep 28, 2023 am 10:48 AM

React前後端分離指南:如何實現前後端的解耦和獨立部署,需要具體程式碼範例在當今的Web開發環境中,前後端分離已經成為一種趨勢。透過將前端和後端程式碼分開,可以讓開發工作更加靈活、高效,並且方便進行團隊協作。本文將介紹如何使用React實現前後端分離,從而實現解耦和獨立部署的目標。首先,我們要先理解什麼是前後端分離。傳統的Web開發模式中,前端和後端是耦合在

如何利用React和RabbitMQ建立可靠的訊息應用 如何利用React和RabbitMQ建立可靠的訊息應用 Sep 28, 2023 pm 08:24 PM

如何利用React和RabbitMQ建立可靠的訊息傳遞應用程式引言:現代化的應用程式需要支援可靠的訊息傳遞,以實現即時更新和資料同步等功能。 React是一種流行的JavaScript庫,用於建立使用者介面,而RabbitMQ是一種可靠的訊息傳遞中間件。本文將介紹如何結合React和RabbitMQ建立可靠的訊息傳遞應用,並提供具體的程式碼範例。 RabbitMQ概述:

React Router使用指南:如何實現前端路由控制 React Router使用指南:如何實現前端路由控制 Sep 29, 2023 pm 05:45 PM

ReactRouter使用指南:如何實現前端路由控制隨著單頁應用的流行,前端路由成為了一個不可忽視的重要部分。 ReactRouter作為React生態系統中最受歡迎的路由庫,提供了豐富的功能和易用的API,使得前端路由的實作變得非常簡單和靈活。本文將介紹ReactRouter的使用方法,並提供一些具體的程式碼範例。安裝ReactRouter首先,我們需要

PHP、Vue和React:如何選擇最適合的前端框架? PHP、Vue和React:如何選擇最適合的前端框架? Mar 15, 2024 pm 05:48 PM

PHP、Vue和React:如何選擇最適合的前端框架?隨著互聯網技術的不斷發展,前端框架在Web開發中起著至關重要的作用。 PHP、Vue和React作為三種代表性的前端框架,每一種都具有其獨特的特徵和優勢。在選擇使用哪種前端框架時,開發人員需要根據專案需求、團隊技能和個人偏好做出明智的決策。本文將透過比較PHP、Vue和React這三種前端框架的特徵和使

Java框架與前端React框架的整合 Java框架與前端React框架的整合 Jun 01, 2024 pm 03:16 PM

Java框架與React框架的整合:步驟:設定後端Java框架。建立專案結構。配置建置工具。建立React應用程式。編寫RESTAPI端點。配置通訊機制。實戰案例(SpringBoot+React):Java程式碼:定義RESTfulAPI控制器。 React程式碼:取得並顯示API回傳的資料。

如何利用React開發一個響應式的後台管理系統 如何利用React開發一個響應式的後台管理系統 Sep 28, 2023 pm 04:55 PM

如何利用React開發一個響應式的後台管理系統隨著互聯網的快速發展,越來越多的企業和組織需要一個高效、靈活、易於管理的後台管理系統來處理日常的操作事務。 React作為目前最受歡迎的JavaScript庫之一,提供了一種簡潔、高效和可維護的方式來建立使用者介面。本文將介紹如何利用React開發一個響應式的後台管理系統,並給出具體的程式碼範例。建立React專案首先

vue.js vs.反應:特定於項目的考慮因素 vue.js vs.反應:特定於項目的考慮因素 Apr 09, 2025 am 12:01 AM

Vue.js適合中小型項目和快速迭代,React適用於大型複雜應用。 1)Vue.js易於上手,適用於團隊經驗不足或項目規模較小的情況。 2)React的生態系統更豐富,適合有高性能需求和復雜功能需求的項目。

react有哪些閉包 react有哪些閉包 Oct 27, 2023 pm 03:11 PM

react有事件處理函數、useEffect和useCallback、高階元件等等閉包。詳細介紹:1、事件處理函數閉包:在React中,當我們在元件中定義事件處理函數時,函數會形成一個閉包,可以存取元件作用域內的狀態和屬性。這樣可以在事件處理函數中使用元件的狀態和屬性,實現互動邏輯;2、useEffect和useCallback中的閉包等等。

See all articles