React中常用的鉤子函數:

一. 基礎鉤子

(1)useState

用于在函數組件中添加局部狀態。useState可以傳遞一個參數,做為狀態的初始值,返回一個數組,數組的第一個元素是返回的狀態變量,第二個是修改狀態變量的函數

const [state, setState] = useState(initalState); // 初始化,state可以任意命名setState(newState); // 修改state的值

(2)useEffect

處理副作用(如數據獲取、訂閱、手動 DOM 操作等)。若一個函數組件中定義了多個useEffect,那么他們實際執行順序是按照在代碼中定義的先后順序來執行的。?useEffect可以傳入2個參數:

  • ?第1個參數是定義的執行函數,組件掛載和更新就會執行。

  • 第2個參數是依賴關系(可選參數),如果不傳則每次渲染都會去執行,傳值的話在依賴項發生改變時函數中的代碼才會執行,如果傳空數組則會在組件第一次掛載才會執行。? ? ?

  • return 出去的代碼會在組件卸載時才會執行。

useEffect(() => {// 此處編寫 組件掛載之后和組件重新渲染之后執行的代碼...return () => {// 此處編寫 組件即將被卸載前執行的代碼...}
}, [dep1, dep2 ...]); // 依賴數組

(3)useContext

讀取 React 的上下文(Context)值。useContext 可以避免多層 props 傳遞就能共享狀態。具體用法看下面步驟:

先封裝一個js,里面可以設置初始值,這個初始值,可以在任何地方使用:

?
import React from 'react';
const UserContext = React.createContext( { name: '張三' });   //參數是默認值,可填可不填
export default UserContext;

? 在代碼中引用封裝好的js文件

import React, { useContext } from 'react'
import UserContext from './context';function Demo() {
// 如果React.createContext沒有指定默認值,可以在對應子組件上套上UserContext.Provider來指定值return (<UserContext.Provider value={{ name: '張三' }}><Child /></UserContext.Provider>)
}function Child() {const user = useContext(UserContext);return (<div><p>{`name: ${user.name}`}</p></div>)
}export default Demo;

二. 性能優化鉤子

(1)useMemo

緩存計算結果,避免重復計算(類似 Vue 的?computed)。useMemo 可以傳入2個參數,第1個參數為函數,用來進行一些計算,第2個參數是依賴關系(可選參數),返回值為第一個函數 return 出去的值,只有在依賴項發生變化時才會重新執行計算函數進行計算,如果不傳依賴項,每次組件渲染都會重新進行計算。

  • useMemo在組件頂層調用

  • useMemo不能在事件處理函數、循環或條件語句中調用

const memoizedValue = useMemo(() => {// 計算邏輯...return res;
}, [a, b]);

(2)useCallback

緩存函數,避免子組件不必要的重渲染。


function Parent() {// 不使用 useCallback - 每次渲染都會導致 Child 重新渲染const handleClick = () => { /*...*/ };// 使用 useCallback - 避免 Child 不必要的重新渲染const handleClick = useCallback(() => {/*...*/}, []); // 空依賴表示函數永不變化return <Child onClick={handleClick} />;
}

(3)useTransition?(React 18+)

標記非緊急更新,優化渲染優先級(如搜索框輸入時的延遲渲染)。

const [isPending, startTransition] = useTransition();

(4)useDeferredValue?(React 18+)

延遲更新某些值,避免界面卡頓(如大型列表渲染)。

const deferredValue = useDeferredValue(value);

3. 引用與 DOM 操作

(1)useRef

可以獲取 dom 和 react 組件實例

import { useRef } from 'react'function Demo() {const inputRef = useRef();const handleFocus = () => {inputRef.current.value = 'focus';inputRef.current.focus();}return (<div><input ref={inputRef} /></div>)
}export default Demo;

(2)useImperativeHandle

自定義暴露給父組件的 ref 實例(通常配合?forwardRef?使用)。父組件通過ref.current.getValue()獲取子組件中的value值。

const RichTextEditor = forwardRef((props, ref) => {const [value, setValue] = useState('');useImperativeHandle(ref, () => ({getValue: () => value,}));return (...);
})export default RichTextEditor;

4. 其他鉤子

(1)useReducer

復雜狀態邏輯管理(類似 Redux 的 reducer)。

// 代碼示例
import React, { useReducer } from 'react'// 1.需要有一個 reducer 函數,第一個參數為之前的狀態,第二個參數為行為信息
function reducer(state, action) {switch (action) {case 'add':return state + 1;case 'minus':return state - 1;default:return 0;}
}function Demo() {// 2.引入useReducer,第一個參數時上面定義的reducer,第二個參數時初始值// 3.返回為一個數組,第一項為狀態值,第二項為一個 dispatch 函數,用來修改狀態值const [count, dispatch] = useReducer(reducer, 0);return (<div><button onClick={() => { dispatch('add') }} >add</button><button onClick={() => { dispatch('minus') }} >minus</button><button onClick={() => { dispatch('unknown') }} >unknown</button><p>{`count: ${count}`}</p></div>);
}export default Demo;

(2)useLayoutEffect

類似?useEffect,但會在 DOM 更新后同步執行(適合測量 DOM 布局)。useLayoutEffect 使用方法、所傳參數和 useEffect 完全相同。大多數情況下將 useEffect 替換成 useLayoutEffect 完全看不出區別。
唯一區別就是:使用 useEffect 時,頁面掛載會出現閃爍。而使用 useLayoutEffect 時頁面沒有閃爍,是因為 useEffect 是在頁面渲染完成后再去更新數據的,所以會出現短暫的閃爍,而 useLayoutEffect 是在頁面還沒有渲染時就將數據給更新了,所以沒有出現閃爍。
注意:大部分情況用useEffect就足夠了,useLayoutEffect 會阻塞渲染,所以需要小心的使用。

(3)useDebugValue

在 React 開發者工具中為自定義鉤子添加標簽。

useDebugValue(value, formatFn);

(4)useId?(React 18+)

生成唯一 ID,用于無障礙訪問(a11y)或表單關聯。

const id = useId();

三.使用場景總結

鉤子用途
useState管理組件內部狀態
useEffect處理副作用(API 調用、訂閱等)
useContext跨組件共享狀態
useMemo/useCallback優化性能,避免重復計算/渲染
useRef操作 DOM 或保存可變值
useReducer復雜狀態邏輯

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

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

相關文章

如何在 Windows 11 或 10 上通過 PowerShell 安裝 Docker Desktop

了解如何使用 PowerShell 或命令提示符在 Windows 11 或 10 上安裝 Docker CLI 和 Docker Desktop GUI,以創建容器運行虛擬機。無需手動訪問網站下載安裝程序,所有操作都將在命令終端完成。 Docker 是一個強大的容器化平臺,允許開發人員將應用程序及其依賴項打包為輕量級容…

Python實例題:人機對戰初體驗Python基于Pygame實現四子棋游戲

目錄 Python實例題 題目 代碼實現 實現原理 游戲邏輯&#xff1a; AI 算法&#xff1a; 界面渲染&#xff1a; 關鍵代碼解析 游戲棋盤渲染 AI 決策算法 勝利條件檢查 使用說明 安裝依賴&#xff1a; 運行游戲&#xff1a; 游戲操作&#xff1a; 擴展建議 增強…

一文詳解 HLS

1 HLS的簡介 1.1 HLS的背景 從 RTMP&#xff08;Real-Time Messaging Protocol&#xff0c;實時消息傳輸協議&#xff09; 到 HLS&#xff08;HTTP Live Streaming&#xff0c;HTTP直播流&#xff09; 的技術演進&#xff0c;本質上是直播協議從 專有協議 向 通用 Web 協議 的…

go 訪問 sftp 服務 github.com/pkg/sftp 的使用踩坑,連接未關閉(含 sftp 服務測試環境搭建)

前言 最近在使用 sftp 服務時&#xff0c;被告知發起了海量的連接&#xff0c;直接把服務器搞崩&#xff0c;ip 被封了。 這是啥情況&#xff1f; golang 寫的代碼&#xff0c;我就正常的訪問 sftp 服務&#xff0c;連接使用過后也都關閉了&#xff0c;咋會出現連接一直連著…

Android 直接通過 app_process 啟動的應用如何使用 Context

文章目錄 一、問題背景二、代碼實現三、代碼詳解 一、問題背景 在 Android 中&#xff0c;可以使用 Android Studio 編寫 Java 應用程序&#xff0c;通過編譯打包成 apk 文件&#xff0c;然后將文件推送至 /data/local/tmp 等可執行的目錄或安裝打包出來的應用&#xff0c;隨后…

【數據結構與算法】LeetCode 每日三題

如果你已經對數據結構與算法略知一二&#xff0c;現在正在復習數據結構與算法的一些重點知識 ------------------------------------------------------------------------------------------------------------------------- 點贊收藏&#x1f308;&#xff0c;每天更新總結文…

深度“求索”:DeepSeek+Dify構建個人知識庫

目錄 前言 環境部署 安裝Docker 安裝Dify 配置Dify 部署知識庫 創建應用 前言 在當今數字化信息爆炸的時代&#xff0c;數據隱私和個性化知識管理成為企業和個人關注的焦點。Dify&#xff0c;作為一款備受矚目的開源 AI 應用開發平臺&#xff0c;為用戶提供了完整的私有…

【Redis8】最新安裝版與手動運行版

目錄 一、直接運行 1. 下載 Redis百度網盤 2. 解壓后直接運行 redis-server.exe?編輯 二、安裝版運行 雙擊 install_redis_service.bat 輸入安裝路徑&#xff08;請提前創建好安裝路徑&#xff09;后直接回車?編輯 下一步直接回車即可&#xff0c;因為是使用配置模板…

@Column 注解屬性詳解

提示&#xff1a;文章旨在說明 Column 注解屬性如何在日常開發中使用&#xff0c;數據庫類型為 MySql&#xff0c;其他類型數據庫可能存在偏差&#xff0c;需要注意。 文章目錄 一、name 方法二、unique 方法三、nullable 方法四、insertable 方法五、updatable 方法六、column…

使用Gemini, LangChain, Gradio打造一個書籍推薦系統 (第二部分)

建立向量嵌入數據庫 from langchain_community.document_loaders import TextLoader from langchain_text_splitters import CharacterTextSplitter from langchain.docstore.document import Document from langchain_chroma.vectorstores import Chromaimport vertexai from…

【Go-4】函數

函數 函數是編程中的基本構建塊&#xff0c;用于封裝可重用的代碼邏輯。Go語言中的函數功能強大&#xff0c;支持多種特性&#xff0c;如多返回值、可變參數、匿名函數、閉包以及將函數作為值和類型傳遞。理解和掌握函數的使用對于編寫高效、可維護的Go程序至關重要。本章將詳…

【已解決】HBuilder X編輯器在外接顯示器或者4K顯示器怎么界面變的好小問題

觸發方式&#xff1a;主要涉及DPI縮放問題&#xff0c;可能在電腦息屏有概率觸發 修復方式&#xff1a; 1.先關掉軟件直接更改屏幕縮放&#xff0c;然后打開軟件&#xff0c;再關掉軟件恢復原來的縮放&#xff0c;再打開軟件就好了 2.(不推薦&#xff09;右鍵HBuilder在屬性里…

spark調度系統核心組件SparkContext、DAGSchedul、TaskScheduler、Taskset介紹

目錄 1. SparkContext2.DAGScheduler3. TaskScheduler4. 協作關系5 TaskSet的定義6. 組件關系說明Spark調度系統的核心組件主要有SparkContext、DAGScheduler和TaskScheduler SparkContext介紹 1. SparkContext 1、資源申請: SparkContext是Spark應用程序與集群管理器(如St…

VSCode+EIDE通過KeilC51編譯,使VSCode+EIDE“支持”C和ASM混編

在使用Keil C51時&#xff0c;要讓Keil C51支持混編則需要在混編的.c文件上右鍵選擇Options for File *(ALTF7)&#xff0c;打開選項界面后&#xff0c;在 Properties 頁 勾上 Generate Assembler SRC File 和 Assemble SRC File &#xff0c;如下圖所示&#xff1a; 這樣設置后…

SQLynx:一款跨平臺的企業級數據庫管理工具

SQLynx 是一款支持跨平臺&#xff08;Windows、Linux、macOS、Web&#xff09;的企業級數據庫管理和 SQL 工具&#xff0c;可以提供高效、安全且適配國產化技術棧的數據庫管理解決方案。 數據源 SQLynx 支持連接各種關系型數據庫、非關系型數據庫以及大數據平臺&#xff0c;包…

實戰項目8(實訓)

目錄 項目01 【sw1】配置 【sw2】配置 任務結果截圖 項目02 【sw1】配置 【sw2】配置 任務結果截圖 項目03 【sw1】配置 任務結果截圖 項目04 【sw1】配置 【r1】配置 任務結果截圖 項目05 【r1】配置 【r2】配置 【r3】配置 任務結果截圖 項目06 【r1】…

TCP為什么是三次握手,而不是二次?

為什么需要三次握手&#xff1f; 想象一下&#xff0c;你要給遠方的朋友寄一份重要文件。你會怎么做&#xff1f; 普通人的做法&#xff1a; 直接扔進郵箱&#xff0c;祈禱別丟了 聰明人的做法&#xff1a; 先打電話確認地址&#xff0c;再發快遞&#xff0c;最后確認收到 T…

dubbo使用nacos作為注冊中心配置

<dubbo:registry protocol"nacos" address"${dubbo.registry.address.nacos}" /> <dubbo:metadata-report address"${dubbo.metadata-report.address}"/> 如果有多個地址&#xff0c;這塊如何配置呢&#xff1f; nacos://ip:端口?…

教師角色的轉變:從知識傳授者到學習引導者

教師角色的轉變&#xff1a;從知識傳授者到學習引導者 隨著人工智能&#xff08;AI&#xff09;和信息技術的迅速發展&#xff0c;教育正在經歷深刻的變革。其中&#xff0c;教師角色的轉變尤為關鍵。傳統上&#xff0c;教師主要承擔“知識傳授者”的職責&#xff0c;即向學生…

PostgreSQL 用戶權限與安全管理

1 系統默認角色 postgres# select rolname from pg_roles; rolname ----------------------------- postgres pg_database_owner pg_read_all_data pg_write_all_data pg_monitor pg_read_all_settings pg_read_all_stats pg_stat_scan_tables …