受控組件和非受控組件的區別

在 React 中,?受控組件(Controlled Components)? 和 ?非受控組件(Uncontrolled Components)? 是處理表單元素的兩種不同方式,它們的核心區別在于 ?數據管理的方式 和 ?與 React 的交互模式。

受控組件(Controlled Components)

定義

表單元素(如 <input><textarea><select>)的值由 ?Reactstate 完全控制。用戶輸入會觸發 React 的狀態更新,表單的當前值始終與 Reactstate 同步。

關鍵特征

  • 數據流:單向綁定(從 React state 到 DOM)。
  • 更新方式:通過 onChange 事件手動更新 state。
  • 值的來源:組件的 value 或 checked 屬性直接綁定到 state。

代碼示例

import { useState } from 'react';function ControlledForm() {const [inputValue, setInputValue] = useState('');const handleChange = (e) => {setInputValue(e.target.value); // 手動同步到 state};return (<inputtype="text"value={inputValue} // 值由 React state 控制onChange={handleChange}/>);
}

適用場景

  • 需要實時驗證輸入(如密碼強度檢查)。
  • 動態表單(如根據輸入內容顯示其他字段)。
  • 強制輸入格式(如只能輸入數字)。

優點

  • 完全控制表單數據,確保 React state 是唯一數據源。
  • 支持復雜的交互邏輯(如輸入時實時反饋)。

缺點

  • 代碼量較多(需要為每個表單元素編寫事件處理函數)。
  • 頻繁的 state 更新可能導致性能問題(大型表單需優化)。

非受控組件(Uncontrolled Components)

定義

表單元素的值由 ?DOM 自身管理,React 通過 ref 在需要時(如表單提交時)直接讀取 DOM 的值。用戶輸入不會觸發 React 的狀態更新。

關鍵特征

  • 數據流:直接操作 DOM。
  • 更新方式:通過 ref 手動獲取值。
  • 值的來源:DOM 節點的當前值。

代碼示例

import { useRef } from 'react';function UncontrolledForm() {const inputRef = useRef(null);const handleSubmit = (e) => {e.preventDefault();console.log(inputRef.current.value); // 通過 ref 獲取 DOM 值};return (<form onSubmit={handleSubmit}><inputtype="text"ref={inputRef} // 使用 ref 關聯 DOM 節點defaultValue="初始值" // 僅初始化時設置默認值/><button type="submit">提交</button></form>);
}

適用場景

  • 簡單表單(不需要實時驗證或動態交互)。
  • 文件上傳(<input type="file"> 必須用非受控組件)。
  • 性能敏感場景(避免頻繁 state 更新)。

優點

  • 代碼簡潔,無需管理狀態。
  • 性能更好(減少渲染次數)。

缺點

  • 無法實時控制數據(如強制輸入格式)。
  • 不符合 React 的“單一數據源”原則。

核心區別對比

特性受控組件非受控組件
數據管理React state 控制DOM 自身管理
值同步實時同步(onChange 事件)手動獲取(通過 ref)
?初始值設置通過 value 屬性通過 defaultValue 屬性
表單驗證時機輸入時實時驗證提交時驗證
代碼復雜度較高(需處理事件和狀態)較低(直接操作 DOM)
性能可能較低(頻繁渲染)較高
React 哲學匹配度高(符合單向數據流)低(依賴 DOM 操作)

如何選擇

  1. 優先受控組件:

大多數場景推薦使用受控組件,尤其是需要實時交互、驗證或動態表單時。

  1. 非受控組件的合理場景:
  • 文件上傳(<input type="file">)。
  • 性能敏感且無需實時反饋的表單。
  • 與非 React 的第三方庫集成(如富文本編輯器)。

注意點

  1. 文件輸入

<input type="file"> 必須用非受控組件,因為其值只能由用戶設置(安全限制)。

  1. 默認值:

非受控組件用 defaultValuedefaultChecked 設置初始值(類似原生 HTML)。

  1. 受控組件的性能優化:

大型表單中避免頻繁渲染,可通過防抖(debounce)或 useCallback 優化事件處理函數。

總結

  • ?受控組件:數據由 React 完全控制,適合復雜交互。
  • 非受控組件:數據由 DOM 管理,適合簡單場景或性能敏感需求。

根據實際需求選擇,優先遵循 React 的單向數據流原則,僅在必要時使用非受控組件。

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

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

相關文章

邁向云原生:理想汽車 OLAP 引擎變革之路

在如今數據驅動的時代&#xff0c;高效的分析引擎對企業至關重要。理想汽車作為智能電動汽車的領軍企業&#xff0c;面臨著海量數據分析的挑戰。本文將展開介紹理想汽車 OLAP 引擎從存算一體向云原生架構演進的變革歷程&#xff0c;以及在此過程中面臨的挑戰&#xff0c;以及是…

ZLMediaKit 源碼分析——[3] ZLToolKit 中EventPoller之網絡事件處理

系列文章目錄 第一篇 基于SRS 的 WebRTC 環境搭建 第二篇 基于SRS 實現RTSP接入與WebRTC播放 第三篇 centos下基于ZLMediaKit 的WebRTC 環境搭建 第四篇 WebRTC學習一&#xff1a;獲取音頻和視頻設備 第五篇 WebRTC學習二&#xff1a;WebRTC音視頻數據采集 第六篇 WebRTC學習三…

【分布式】分布式限流方案解析

文章目錄 固定窗口限流方案?實現方式?優點?缺點? 滑動窗口限流方案?實現方式?優點?缺點? 令牌桶限流方案?實現方式?優點?缺點? 漏斗限流方案?實現方式?優點?缺點? 在分布式系統蓬勃發展的當下&#xff0c;系統面臨的流量挑戰日益復雜。為確保系統在高并發場景下…

WPS JS宏編程教程(從基礎到進階)-- 第三部分:JS宏編程語言開發基礎

第三部分:JS宏編程語言開發基礎 @[TOC](第三部分:JS宏編程語言開發基礎)**第三部分:JS宏編程語言開發基礎**1. 變量與數據類型**變量聲明:三種方式****示例代碼****數據類型判斷****實戰:動態處理單元格類型**2. 運算符全解析**算術運算符****易錯點:字符串拼接 vs 數值相…

Python - 爬蟲-網頁抓取數據-庫urllib

urllib庫是Python內置的HTTP請求庫。無需額外安裝&#xff0c;可以直接使用。urllib庫包含以下四個模塊。 urllib.request - 打開和讀取 URL。urllib.error - 包含 urllib.request 拋出的異常。urllib.parse - 解析 URL。urllib.robotparser - 解析 robots.txt 文件。 1、reque…

C++進階知識復習 1~15

C 進階總復習 &#xff08;1~15&#xff09; 目的1. 介紹下程序從編寫到可執行的整個過程2. C中的auto和decltype的區別3. 介紹下多態的實現原理4. C中的new[] 和delete[] 為什么一定要配對使用&#xff1f;5. C中malloc申請的內存 可以使用delete釋放嘛6. 什么情況下會出現內存…

輸電線路航空標志球:低空飛行的安全路標 / 恒峰智慧科技

在現代社會&#xff0c;隨著航空業的快速發展&#xff0c;低空飛行活動日益頻繁。為了確保飛行安全&#xff0c;避免飛機與高壓電線等障礙物發生碰撞&#xff0c;輸電線路航空標志球應運而生。這種裝置被廣泛應用于高壓輸電線路上&#xff0c;尤其是超高壓和跨江輸電線&#xf…

Debian/Ubuntu的networking的`/etc/network/interfaces`配置文件詳解

Debian/Ubuntu的networking的/etc/network/interfaces配置文件詳解 Debian/Ubuntu 的 /etc/network/interfaces 配置文件詳解 在 Debian/Ubuntu 系統中&#xff0c;/etc/network/interfaces 是傳統網絡接口配置文件&#xff0c;用于定義網絡接口的靜態/動態配置。以下是逐項解…

OpenCV 圖形API(或稱G-API)(1)

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 引言 OpenCV 圖形API&#xff08;或稱G-API&#xff09;是一個新的OpenCV模塊&#xff0c;旨在使常規圖像處理更快且更便攜。通過引入一種新的基于圖的執行…

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal

Leetcode 3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3505. Minimum Operations to Make Elements Within K Subarrays Equal 1. 解題思路 這一題大的思路上不難想到就是一個動態規劃的思路。我們分別…

win10之mysql server 8.0.41安裝

一 mysql server 下載 官網下載地址頁面 https://dev.mysql.com/downloads/mysql/二 免裝版使用步驟 1 解壓 下載完成后,解壓文件夾,如下所示: 2 執行安裝命令 D:\soft\mysql\mysql-8.0.41-winx64\mysql-8.0.41-winx64\bin>mysqld --install Service successfully in…

第十二屆藍橋杯省賽軟件類(cc++組)

第一題&#xff08;空間&#xff09; 解題思路 答案 #include <stdio.h>int main() {// 計算256MB對應的字節數&#xff0c;1MB 1024KB&#xff0c;1KB 1024Blong long total_bytes 256 * 1024 * 1024; // 每個32位二進制整數占4個字節&#xff08;32 / 8 4&#xf…

C++ 新特性 | C++ 11 | 移動語義

文章目錄 一、移動語義1、為什么需要移動語義&#xff1f;2、怎么“偷”&#xff1f;——右值引用&#xff08;&&&#xff09;3、如何實現移動語義&#xff1f;——移動構造函數/賦值4、什么時候觸發移動&#xff1f;5、移動 vs 拷貝 一、移動語義 1、為什么需要移動語…

wsl下ubuntu安裝寶塔

在 WSL (Windows Subsystem for Linux) 下的 Ubuntu 中安裝寶塔面板的步驟如下&#xff1a; 1. 確保 WSL 環境正常 已安裝 WSL 2 并啟用 Ubuntu 發行版&#xff08;推薦 Ubuntu 20.04/22.04&#xff09;。 在 PowerShell 中檢查 WSL 版本&#xff1a; wsl --list --verbose 如…

UDP網絡通信

UDP網絡通信&#xff1a; 步驟1 創建套接字&#xff1a; #include <sys/types.h> #include <sys/socket.h>int socket(int domain, int type, int protocol);參數一 domain&#xff1a; AF_UNIX Local communication unix(7) 本地通信 AF_INET IPv4 Inte…

教你快速理解linux中的NUMA節點探測是干什么用的?

想象一個大城市被劃分成幾個區&#xff08;比如東區、西區&#xff09;。每個區有自己的超市&#xff08;內存&#xff09;&#xff0c;居民&#xff08;CPU&#xff09;去本區的超市買東西最快&#xff0c;去其他區的超市會慢一些。 NUMA節點探測&#xff0c;就是Linux系統在…

使用 Less 實現 PC 和移動端樣式適配

&#x1f310; 使用 Less 實現 PC 和移動端樣式適配 —— 以 position 屬性為例 在前端開發中&#xff0c;我們常常會遇到這樣一個場景&#xff1a; 在 PC 頁面中需要某個元素是 position: relative;&#xff0c;但在移動端卻希望它是 position: inherit;&#xff0c;以便更靈…

企業戰略管理(設計與工程師類)-2-戰略規劃及管理過程-1-概述

戰略管理過程 參考資料&#xff1a; 戰略管理 - 清華大學- 蔡臨寧公司戰略與風險管理 - 華中科技大學 - 賀遠瓊戰略管理 - 北京理工大學 - 楊萬榮DeepSeek - 深度思考與聯網檢索 AFI框架 戰略管理最典型的就是采用傳統的AFI通用戰略管理框架&#xff08;模型&#xff09;&a…

Swoole 的 Hyperf 框架和 Go 的 Gin 框架高并發原理以及技術實現對比分析

Swoole 的 Hyperf 框架和 Go 的 Gin 框架雖然都支持高并發&#xff0c;但它們的實現原理、底層機制和適用場景有顯著差異。以下從 高并發原理、技術實現區別、優缺點 三個方面詳細分析&#xff1a; 一、高并發實現原理 1. Hyperf (PHP Swoole) Hyperf 的高并發能力基于 Swoo…

【教程】如何利用bbbrisk一步一步實現評分卡

利用bbbrisk一步一步實現評分卡 一、什么是評分卡1.1.什么是評分卡1.2.評分卡有哪些 二、評分卡怎么弄出來的2.1.如何制作評分卡2.2.制作評分卡的流程 三、變量的分箱3.1.數據介紹3.2.變量自動分箱3.3.變量的篩選 四、構建評分卡4.1.評分卡實現代碼4.2.評分卡表4.3.閾值表與分數…