React中常用的Hook(useEffect、useRef、useMemo、useNavigate、useParams)

React hook1:useEffect

在編程中,副作用是指函數或表達式在執行過程中對外部環境產生影響的行為。例如:

  • 修改外部變量(如全局變量、DOM、API 請求、設置定時器等)

什么是純函數?

// 純函數:輸入相同,輸出必定相同,不影響外部
function add(a, b) {return a + b; 
}
//有副作用的函數:影響外部狀態
function updateDOM() {document.title = "Changed!"; //副作用:修改DOM
}

React 推崇函數式編程,核心思想是:

  • 組件應該是純函數(給定相同的props和state,渲染相同的 UI)
  • 副作用應該被隔離,不能直接在渲染過程中執行

React 如何處理副作用?渲染和外部處理相分離。
由于渲染必須是純的,React 提供了useEffect 讓副作用在渲染完成后執行,而不是在渲染期間執行。

useEffect是 React 提供的副作用隔離機制,讓不純的操作(如API請求、DOM修改)不影響組件的純渲染邏輯,同時提供清理和優化能力。

  1. 保持渲染純凈(在組件渲染到屏幕之后運行)
  2. 避免阻塞渲染
  3. 自動清理副作用(可以返回一個清理函數,在組件卸載時執行)
react jsx title="useEffect基礎用法"
import { useEffect } from 'react';function Example() {useEffect(() => {console.log('組件首次渲染后執行');}, []); // 空依賴數組表示只運行一次return <div>組件內容</div>;
}
react jsx title="useEffect引入依賴項監聽變化"
function Example({ id }) {useEffect(() => {console.log('id 變化時執行:', id);}, [id]); // 僅在 id 變化時重新執行return <div>ID: {id}</div>;
}
react jsx title="useEffect清理副作用"
function Example() {useEffect(() => {const timer = setInterval(() => {console.log('定時器運行中...');}, 1000);return () => {clearInterval(timer); // 組件卸載時清理定時器};}, []);return <div>查看控制臺</div>;
}

React hook2:useRef

useRef用于直接操作 DOM或存儲可變值(不會觸發重新渲染)。

用法1:操作DOM

import { useRef } from 'react';function InputFocus() {const inputRef = useRef(null); // 1. 創建 refconst handleClick = () => {inputRef.current.focus(); // 3. 通過 .current 操作 DOM};return (<div>{/* 2. 綁定 ref 到元素 */}<input ref={inputRef} type="text" /><button onClick={handleClick}>聚焦輸入框</button></div>);
}

用法2:存儲可變值,不觸發重新渲染

import { useRef, useState } from 'react';function Counter() {const [count, setCount] = useState(0);const renderCount = useRef(0); // 存儲組件渲染次數(不會觸發更新)renderCount.current += 1; // 修改值(不會導致重新渲染)return (<div><p>Count: {count}</p><p>組件渲染次數: {renderCount.current}</p><button onClick={() => setCount(count + 1)}>增加</button></div>);
}

useRef的底層機制

// 近似實現(React 內部簡化邏輯)
function useRef(initialValue) {return { current: initialValue }; // 每次都返回同一個對象!
}
  • 存儲原理:React 在組件首次渲染時創建這個{ current: … }對象,后續所有渲染都返回同一個對象(引用不變)。
  • 修改current:直接修改current屬性不會觸發渲染,因為對象本身的引用沒變,React 不會檢測到變化。

為什么操作 DOM 需要綁定到標簽?

<input ref={inputRef} /> 

React 的隱藏邏輯:當ref屬性綁定到 DOM 標簽時,React 會在渲染結束后自動將 DOM 節點賦值給inputRef.current。

// React 內部類似這樣處理
const domNode = document.createElement('input');
inputRef.current = domNode; // 自動填充 DOM 節點

存儲變量為何不需要綁定?

const renderCount = useRef(0);
renderCount.current += 1; // 直接修改即可

存儲變量時,current只是一個普通屬性,你可以自由讀寫,React 不會干涉它的值。

關鍵區別總結

場景是否需要綁定到標簽current的值來源
操作 DOM需要由 React 自動填充為 DOM 節點
存儲可變值不需要由開發者手動賦值/修改

React hook3:useMemo

useMemo用于緩存計算結果,只有當依賴項變化時才重新計算,避免重復渲染時不必要的計算開銷。

function UserList({ users, searchTerm }) {// 緩存過濾后的用戶列表,只有當users或searchTerm變化時才重新過濾const filteredUsers = useMemo(() => {return users.filter(user => user.name.toLowerCase().includes(searchTerm.toLowerCase()));}, [users, searchTerm]);return (<ul>{filteredUsers.map(user => (<li key={user.id}>{user.name}</li>))}</ul>);
}

React hook4:useNavigate

**useNavigate 就像一個提供多種導航工具的“工具箱”,可以從中選擇需要的功能來完成路由跳轉、前進/后退、傳遞數據等操作。**用“工具箱”類比 useNavigate:

工具箱里的工具對應 useNavigate 的功能
導航地圖navigate(‘/path’) —— 直接跳轉到指定路徑。
橡皮擦navigate(‘/path’, { replace: true }) —— 替換當前路由(擦掉當前記錄,不保留歷史)。
時間機器按鈕navigate(1) 或 navigate(-1) —— 前進或后退到歷史記錄中的頁面。
快遞包裹navigate(‘/path’, { state: { data } }) —— 跳轉時攜帶隱藏數據(偷偷塞個包裹給下個頁面)。

React hook5:useParams()

useParams從當前 URL 路徑中提取參數。

示例代碼:

<Route path="/user/:id" element={<UserProfile />} />
import { useParams } from 'react-router-dom';function UserProfile() {// 提取 URL 中的動態參數(比如 :id)const params = useParams();console.log(params.id); // 訪問 /user/123 時,輸出 "123"return <h1>用戶ID: {params.id}</h1>;
}

當用戶訪問 /user/123 時,useParams() 會提取出 { id: ‘123’ }。

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

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

相關文章

關聯規則挖掘1:Apriori算法

目錄 一、Apriori算法核心原理 1. 基本概念 2. Apriori性質 二、完整案例計算&#xff08;超市購物數據&#xff09; ?步驟1&#xff1a;按字母序重排每筆交易? ?步驟2&#xff1a;統計頻繁1-項集&#xff08;min_support40%&#xff09;?? ?步驟3&#xff1a;生成…

基于 C++ 線程池的多線程目標檢測后處理系統設計與實現

在實際的智能視頻分析系統中,目標檢測(如 YOLOv5)只是第一步。檢測結果往往需要進行后續處理:畫框、報警、推流、日志記錄等。這些操作如果在檢測主線程中同步執行,會嚴重拖慢整體推理速度。 本文將帶你從零實現一個基于 C++ 模板線程池的異步后處理系統,實現“檢測與后…

Java并發容器詳解

1. JUC并發容器概述 Java集合容器框架主要有四大類別&#xff1a;List、Set、Queue、Map。常見的ArrayList、LinkedList、HashMap等容器都是非線程安全的。 Java提供了同步容器&#xff08;如Vector、Hashtable、SynchronizedList&#xff09;通過synchronized實現同步&#xf…

SpringAI系列---【SpringA集成OllamaI如何先調用向量庫,再把查到的結果一起傳給大模型?】

SpringAI如何先調用向量庫&#xff0c;再把查到的結果一起傳給大模型&#xff1f; 1.引入pom <dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></depend…

告別“測試滯后”:AI實時測試工具在敏捷開發中的落地經驗

告別“測試滯后”&#xff1a;AI實時測試工具在敏捷開發中的落地經驗 在敏捷開發的“快速迭代”節奏中&#xff0c;測試環節常常成為“拖后腿”的短板。某互聯網公司的敏捷團隊曾陷入這樣的循環&#xff1a;2周迭代周期中&#xff0c;開發用10天完成功能&#xff0c;留給測試的…

K8S-Pod資源對象

一、K8S架構與組件1、K8S架構k8s 總體架構采用了經典的 maste/slave 架構模式&#xff0c;分 master 節點和 worker 節點&#xff0c;節點可以是虛擬機也可以是物理機。K8S組件 master 節點組件Kube-apiserver 用于暴露 Kubernetes API&#xff0c;任何資源請求或調用操作都是通…

PyTorch API 5

文章目錄torch.compiler延伸閱讀torch.fft快速傅里葉變換輔助函數torch.func什么是可組合的函數變換&#xff1f;為什么需要可組合的函數變換&#xff1f;延伸閱讀torch.futurestorch.fx概述編寫轉換函數圖結構快速入門圖操作直接操作計算圖使用 replace_pattern() 進行子圖重寫…

基于決策樹模型的汽車價格預測分析

一、整體流程概覽這份代碼實現了一個完整的機器學習預測流程&#xff0c;核心目標是通過汽車的各項特征預測其價格。整體流程分為 6 個主要步驟&#xff1a;模擬生成汽車數據集&#xff08;含價格標簽&#xff09;數據預處理&#xff08;清洗、編碼、特征選擇&#xff09;探索性…

0基礎安卓逆向原理與實踐:第2章:編程基礎與工具鏈

第2章:編程基礎與工具鏈 2.1 Java編程基礎 2.1.1 Java語言特性 Java是安卓應用開發的主要語言,具有以下核心特性: mindmaproot((Java特性))面向對象封裝繼承多態抽象平臺無關字節碼JVM一次編譯到處運行內存管理自動垃圾回收堆棧管理引用類型安全性字節碼驗證安全管理器訪…

深入理解JVM內存結構:從字節碼執行到垃圾回收的全景解析

&#x1f9e0; 深入理解JVM內存結構&#xff1a;從字節碼執行到垃圾回收的全景解析 #JVM內存模型 #Java性能優化 #垃圾回收機制 #并發編程一、JVM內存結構全景圖二、線程共享區域詳解 2.1 堆&#xff08;Heap&#xff09;—— 對象生存的宇宙 存儲內容&#xff1a; 所有new創建…

用 C++ 構建高性能測試框架:從原型到生產實戰指南

用 C 構建高性能測試框架&#xff1a;從原型到生產實戰指南 ?C 測試框架的關鍵價值?&#xff1a;當你的測試需要每秒處理百萬級交易&#xff0c;微秒級延遲要求已成為常態時&#xff0c;Python GC 的暫停便是不可接受的奢侈。 本文將深入探討如何用 C 構建兼具靈活性和高性能…

【C語言16天強化訓練】從基礎入門到進階:Day 4

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題、洛谷刷題、C/C基礎知識知識強化補充、C/C干貨分享&學習過程記錄 &#x1f349;學習方向&#xff1a;C/C方向 ??人…

C語言:字符函數與字符串函數(1)

在編程的過程中&#xff0c;我們經常會遇到需要處理字符和字符串的情況&#xff0c;為了方便操作字符和字符串&#xff0c;C語言標準庫中提供了一系列庫函數&#xff0c;接下來我們就學習一下這些函數。 目錄 1. 字符分類函數 2. 字母轉換函數 3. strlen函數的使用和模擬實現…

數據結構與算法系列(大白話模式)小學生起點(一)

出身&#xff0c;并不重要 &#xff01;&#xff01;&#xff01;&#xff01;只要有恒心&#xff0c;有毅力&#xff0c;肯于付出與學習&#xff0c;皆會取得相應的成就&#xff01;天道酬勤&#xff0c;天行健&#xff0c;君子當自強不息&#xff01;道可道&#xff0c;非常道…

計算機視覺第一課opencv(二)保姆級教學

目錄 簡介 一、邊界填充 1.函數說明 2.案例分析 二、圖像運算 1.號運算 2.cv2.add()函數 3.圖像加權運算 三、閾值處理 四、圖像平滑處理 1.椒鹽噪聲 2.均值濾波&#xff08;Mean Filtering&#xff09; 3.方框濾波 4. 高斯濾波&#xff08;Gaussian Filtering&am…

DINOv3

一、摘要 https://arxiv.org/pdf/2508.10104 自監督學習有望消除對人工數據標注的需求&#xff0c;使模型能夠輕松擴展到大規模數據集和更大規模的架構。由于不針對特定任務或領域進行定制&#xff0c;這種訓練范式具有從各種來源學習視覺表示的潛力&#xff0c;能夠使用單一…

??pytest+yaml+allure接口自動化測試框架

高薪必備&#xff01;18K接口自動化測試框架落地全流程&#xff5c;零基礎到實戰通關前言# 自動化測試&#xff0c;是目前測試行業一項比較普遍的測試技術了&#xff0c;之前的以UI自動化測試為主&#xff0c;現在的以接口自動化測試為主&#xff0c;無論技術更迭&#xff0c;…

LeetCode每日一題,2025-8-20

統計全為1的正方形子矩陣 這題是正方形&#xff0c;比較簡單 暴力就是二維前綴和。 或者用dp&#xff0c;dp[i][j]表示以i&#xff0c;j為右下角的最大正方形的邊長&#xff0c;它由(i-1,j),(i,j-1),(i-1,j-1)三者共同決定&#xff0c;通過找規律可知&#xff0c;由三個的最小值…

在Excel啟動時直接打開多個Excel文件

如果我們這段時間每天都要打開幾個相同的Excel文件開展工作&#xff0c;可以把這幾個文件放到一個文件夾&#xff08;如果原來就在不同的文件夾&#xff0c;就把快捷方式放到同一個文件夾&#xff09;&#xff0c;然后在Excel選項中設置啟動時打開這個文件夾中的文件即可。注&a…

對象存儲 COS 端到端質量系列 —— 終端網絡診斷工具

背景 在COS終端SDK的眾多功能中&#xff0c;文件上傳功能的使用頗為頻繁。鑒于此&#xff0c;提升文件上傳的成功率便顯得至關重要。眾多導致上傳失敗的因素里&#xff0c;由網絡問題引發的故障無疑是其中影響上傳成功率的關鍵因素之一&#xff0c;同時也是最難以把控的要素。…