React 核心 Hook 與冷門技巧:useReducer、useEffect、useRef 及 is 屬性全解析

📚 前言

React 的函數組件 + Hooks 模式已經成為現代前端開發的主流。相比類組件,Hooks 讓狀態管理和副作用處理更加簡潔和可復用。但在實際開發中,除了常用的 useStateuseEffect,還有很多“進階武器”值得我們掌握。

本文將深入講解三個核心 Hook:useReduceruseEffectuseRef,并揭秘一個常被忽視但極具潛力的 HTML 屬性——is 在 React 中的應用場景,助你寫出更優雅、更高效的 React 代碼。


一、useReducer:復雜狀態管理的利器

1.1 什么是?useReducer

useReducer 是 React 提供的一個 Hook,用于管理組件中復雜的狀態邏輯。它類似于 Redux 的 reducer 模式,但更輕量,無需引入額外庫。

1.2 基本語法

const [state, dispatch] = useReducer(reducer, initialState);
  • reducer:一個純函數?(state, action) => newState
  • initialState:初始狀態
  • dispatch:用于派發動作(action)來更新狀態

1.3 使用場景

? 狀態結構復雜(如嵌套對象)
? 多個狀態相互依賴
? 狀態更新邏輯較多

1.4 示例:計數器

function reducer(state, action) {switch (action.type) {case 'increment': return { count: state.count + 1 };case 'decrement': return { count: state.count - 1 };default: throw new Error();}
}function Counter() {const [state, dispatch] = useReducer(reducer, { count: 0 });return (<div>Count: {state.count}<button onClick={() => dispatch({ type: 'increment' })}>+</button><button onClick={() => dispatch({ type: 'decrement' })}>-</button></div>);
}

💡 優點:邏輯集中、可預測、易于測試。


二、useEffect:副作用的管理中心

2.1 什么是?useEffect

useEffect 用于在函數組件中執行副作用操作,如數據獲取、訂閱、手動 DOM 操作等。它是 componentDidMountcomponentDidUpdatecomponentWillUnmount 的組合。

2.2 基本語法

useEffect(() => {// 副作用邏輯return () => {// 清理邏輯(可選)};
}, [dependencies]);

2.3 常見用法

? 組件掛載后執行一次
useEffect(() => {fetchData();
}, []); // 空依賴數組 → 只執行一次
? 監聽某個狀態變化
useEffect(() => {fetchUserData(userId);
}, [userId]); // userId 變化時重新執行
? 清理資源(防止內存泄漏)
useEffect(() => {const timer = setInterval(() => console.log('tick'), 1000);return () => clearInterval(timer); // 組件卸載時清理
}, []);

?? 注意:避免無限循環、正確處理異步操作。


三、useRef:持久化引用的“盒子”

3.1 什么是?useRef

useRef 返回一個可變的引用對象,其 .current 屬性可以保存任意值,并且修改它不會觸發組件重新渲染

3.2 核心用途

? 1. 訪問 DOM 元素
const inputRef = useRef(null);
useEffect(() => {inputRef.current.focus(); // 自動聚焦
}, []);
<input ref={inputRef} type="text" />
? 2. 存儲可變變量(不觸發重渲染)
const timerRef = useRef(null);
timerRef.current = setInterval(...);
// 清理時使用 clearInterval(timerRef.current)
? 3. 獲取上一次的值
function usePrevious(value) {const ref = useRef();useEffect(() => { ref.current = value; });return ref.current;
}

📌 關鍵區別useRef 不會觸發重渲染,而 useState 會。


四、is?屬性:Web Components 的秘密武器

4.1?is?是 React 關鍵詞嗎?

? 不是! isHTML 標準屬性,用于定義自定義內置元素(Customized Built-in Elements),屬于 Web Components 技術棧。

4.2 作用與語法

讓一個自定義元素繼承原生 HTML 元素的行為

<button is="custom-toggle-button">切換</button>

4.3 在 React 中的使用

<button is="fancy-button" onClick={handleClick}>提交
</button>

前提:已通過 customElements.define('fancy-button', ...) 注冊組件。

4.4 注意事項

  • 僅在使用 Web Components 時需要
  • 不要誤用于條件渲染(如?<div is={true}>??)
  • 老瀏覽器需 polyfill 支持

? 總結對比

特性useReduceruseEffectuseRefis?屬性
用途管理復雜狀態處理副作用持久化引用擴展原生元素
是否觸發重渲染否(通過 dispatch)否(副作用本身)
典型場景表單、多狀態聯動數據請求、定時器DOM 操作、實例變量Web Components
是否 React 獨有? 是? 是? 是? 否(HTML 標準)

🎯 寫在最后

掌握 useReduceruseEffectuseRef 是成為 React 高手的必經之路,而了解 is 屬性則能讓你在面對 Web Components 項目時游刃有余。

希望本文能幫助你更好地理解這些知識點,并在實際項目中靈活運用。如果你覺得有收獲,歡迎點贊、收藏、轉發!

關注我,持續輸出前端干貨!
評論區歡迎交流:你在項目中是如何使用這些特性的?

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

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

相關文章

通義靈碼產品演示: 數據庫設計與數據分析

作者&#xff1a;了哥 演示主題&#xff1a;AI 進行數據庫設計以及做數據分析 演示目的 演示通義靈碼對于數據庫的設計能力以及數據分析能力。 演示準備 準備數據庫&#xff0c;這里為了簡單實用 sqlite3 brew install sqlite3使用 vscode&#xff0c;同時安裝好通義靈碼的插件…

MySQL主從同步參數調優案例

#作者&#xff1a;stackofumbrella 文章目錄一、前言二、故障概述2.1 基礎信息2.2 故障現象描述三、故障診斷分析3.1 排查過程3.2 問題根因四、故障解決方案 &#x1f4ca;4.1 解決方案 &#x1f6e0;?五、總結附件一、前言 在磐基系統中大量使用MySQL作為后端的數據存儲&…

【代碼隨想錄算法訓練營——Day10】棧與隊列——232.用棧實現隊列、225.用隊列實現棧、20.有效的括號、1047.刪除字符串中的所有相鄰重復項

LeetCode題目鏈接 https://leetcode.cn/problems/implement-queue-using-stacks/ https://leetcode.cn/problems/implement-stack-using-queues/description/ https://leetcode.cn/problems/valid-parentheses/description/ https://leetcode.cn/problems/remove-all-adjacent-…

Asp .Net Core 系列:Asp .Net Core 集成 Hangfire+MySQL

在 .NET 或 .NET Core 應用中&#xff0c;若需在不依賴 Windows 服務、獨立進程的前提下實現后臺處理&#xff0c;Hangfire 是最成熟、簡單的方案之一 —— 它可直接嵌入現有應用&#xff08;如 ASP.NET Core Web 應用&#xff09;&#xff0c;無需額外部署&#xff0c;同時提供…

網站漏洞掃描要怎么處理?

在網絡安全領域&#xff0c;網站漏洞是黑客攻擊的重要突破口&#xff0c;而網站漏洞掃描能及時發現這些隱患。但很多小白在完成漏洞掃描后&#xff0c;不清楚后續該如何處理&#xff0c;導致漏洞一直存在&#xff0c;給網站安全埋下風險。下面從準備工作、處理步驟、驗證維護等…

淘寶RecGPT:通過LLM增強推薦

導論背景 (Background)??推薦系統的核心挑戰??&#xff1a;怎么 準確推斷 用戶行為背后快速變化的真實意圖&#xff0c;以實現用戶、商戶和平臺的三贏。??現有方法的局限性??&#xff1a;傳統的基于歷史日志共現模式&#xff08;“從點擊學習點擊”&#xff09;的模型&…

【Go系統編程】07 網絡化IPC:Go的王牌——Socket編程

大家好&#xff0c;我是Tony Bai。歡迎來到我們《Go 系統編程》專欄的最后一講。在過去的旅程中&#xff0c;我們探索了管道、消息隊列、共享內存等一系列強大的 IPC 機制。它們各有所長&#xff0c;但都有一個共同的、致命的局限性&#xff1a;它們都只能在同一臺物理機上工作…

claude code使用小竅門

視頻地址 B站 1 /init 在項目最開始的時候&#xff0c;使用/init可以將項目通讀一遍。cc會將學習到的關于項目的知識都保存到CLAUD.MD文件中 2、 /compact 用來壓縮對話的上下文&#xff0c;claude會將之前的一些亂七八糟或者重復的對話刪除壓縮&#xff0c;有利于提高AI的…

The learning process of Decision Tree Model|決策樹模型學習過程

----------------------------------------------------------------------------------------------- 這是我在我的網站中截取的文章&#xff0c;有更多的文章歡迎來訪問我自己的博客網站rn.berlinlian.cn&#xff0c;這里還有很多有關計算機的知識&#xff0c;歡迎進行留言或…

期貨盤后空開是認購期權行權?

本文主要介紹期貨盤后空開是認購期權行權&#xff1f;期貨盤后空開與認購期權行權是兩個獨立的概念&#xff0c;無直接關聯&#xff0c;需從交易機制、操作邏輯及市場規則三方面區分。期貨盤后空開是認購期權行權&#xff1f;1. 定義與交易屬性期貨盤后空開&#xff1a;屬于期貨…

ESP32 I2S音頻總線學習筆記(七):制作一個錄音播放器

簡介 上一篇我們利用I2S輸出DIY了一個藍牙音箱簡單玩了一下&#xff0c;本篇我們繼續來看代碼。前面幾篇文章我們分別介紹了I2S輸入&#xff0c;I2S輸出&#xff0c;以及WAV文件格式的相關內容&#xff0c;那我們就可以根據所學到的&#xff0c;制作一個錄音機&#xff0c;具體…

PyTorch 動態圖的靈活性與實用技巧

PyTorch 以其動態計算圖&#xff08;Dynamic Computation Graph&#xff09;而聞名&#xff0c;這賦予了它極高的靈活性和易用性&#xff0c;使其在研究和實際應用中都備受青睞。與TensorFlow 1.x的靜態圖&#xff08;需要先定義圖結構&#xff0c;再運行&#xff09;不同&…

#C語言——刷題攻略:牛客編程入門訓練(十一):攻克 循環控制(三),輕松拿捏!

&#x1f31f;菜鳥主頁&#xff1a;晨非辰的主頁 &#x1f440;學習專欄&#xff1a;《C語言刷題合集》 &#x1f4aa;學習階段&#xff1a;C語言方向初學者 ?名言欣賞&#xff1a;"代碼行數決定你的下限&#xff0c;算法思維決定你的上限。" 前言&#xff1a;在學習…

復雜PDF文檔結構化提取全攻略——從OCR到大模型知識庫構建

在學術研究、金融分析、法律合同、工程設計等眾多領域&#xff0c;PDF文檔已成為信息存儲與傳遞的重要載體。然而&#xff0c;面對包含復雜表格、公式、圖表、手寫批注、多欄排版等元素的PDF&#xff0c;傳統工具往往難以準確、完整地提取內容。這不僅影響信息利用效率&#xf…

HttpClient、OkHttp 和 WebClient

HttpClient、OkHttp 和 WebClient 是 Java 生態中常見的 HTTP 客戶端&#xff0c;它們在設計理念、異步能力、性能等方面有所不同。以下是它們的詳細對比&#xff1a;1. 概述客戶端介紹Apache HttpClient傳統同步 HTTP 客戶端&#xff0c;功能豐富&#xff0c;歷史悠久&#xf…

書籍成長書籍文字#創業付費雜志《財新周刊》2025最新合集 更33期

免費訪問地址 https://isharehubs.com/article/2025-33-26c27ee5bb9180cdafc5efbec9545ac5 資源信息 付費雜志《財新周刊》2025最新合集 更33期 《財新周刊》2025 最新合集&#xff08;更至 33 期&#xff09;重磅上線&#xff0c;聚焦年度熱點與結構性變化&#xff0c;從監…

用python的socket寫一個局域網傳輸文件的程序

局域網傳輸文件是最最常用的功能&#xff0c;我參考https://www.jb51.net/python/345837qrz.htm這篇文章&#xff0c;復制粘貼&#xff0c;開發了一個。但發現進度條沒有用&#xff0c;也沒有顯示傳輸用時和傳輸速度的功能&#xff0c;于是我改寫了代碼&#xff0c;使它實現這個…

深度剖析Linux內核無線子系統架構

文章目錄1、資料快車2、目錄介紹2、術語3、Linux無線子系統概述4、內核無線子系統框架1&#xff09;認識內核無線子系統中的三個軟件框架2、無線網絡子系統框架3、Android WIFI Management框架1&#xff09;fullMAC和softMAC是什么&#xff1f;2&#xff09;fullmac對比softmac…

unity UGUI 鼠標畫線

using UnityEngine; using UnityEngine.EventSystems; using System.Collections.Generic; using UnityEngine.UI; /* 使用方法&#xff1a; 在場景中新建一個空的 GameObject&#xff08;右鍵 -> UI -> 空對象&#xff0c;或直接創建空對象后添加 RectTransform 組件&am…