React表單處理:如何獲取輸入框(input)的值?(受控組件)

系列回顧:
在前面的文章中,我們已經掌握了State、Props、事件處理、列表渲染和條件渲染。我們的應用已經能展示動態內容并響應用戶的點擊。現在,我們要 tackling 一個非常常見的需求:如何獲取用戶在表單輸入框(<input>)里輸入的內容?比如,在一個登錄頁面,我們需要拿到用戶輸入的用戶名和密碼。

歡迎來到React學習的第七站!

在傳統的HTML和jQuery中,我們通常是在需要的時候(比如點擊提交按鈕時)才去DOM中“讀取”輸入框的值。但在React中,我們有一種更推薦、更“React”的方式,叫做受控組件 (Controlled Components)

什么是受控組件?

簡單來說,一個受控組件就是:一個表單元素(如<input>, <textarea>, <select>),它的值完全由React的State來“控制”。

它的工作流程是這樣的:

  1. 我們用 useState 創建一個 State 變量,用來存儲輸入框的值。
  2. 我們把這個 State 變量的值,通過 value 屬性,賦給輸入框。
  3. 我們給輸入框綁定 onChange 事件。每當用戶在輸入框里打字時,onChange 事件就會被觸發。
  4. onChange 的事件處理函數里,我們獲取輸入框的最新值,然后調用 setState 函數來更新我們的 State。
  5. 由于 State 發生了變化,React 會重新渲染組件,輸入框的 value 也隨之更新,顯示出最新的內容。

聽起來有點繞?別擔心,我們通過一個實戰案例來走一遍,你馬上就會明白。

核心思想: 輸入框里顯示什么,不再是輸入框自己說了算,而是由React的State說了算。實現了數據(State)和視圖(UI)的完全同步


實戰:創建一個簡單的用戶名輸入框

我們的目標是:創建一個輸入框,用戶在里面輸入的任何內容,都會被實時地顯示在頁面的另一個地方。

第一步:準備App.jsx

老規矩,我們先搭好架子,并用useState創建一個username的State,初始值為空字符串 ''

import { useState } from 'react';
import './App.css';function App() {const [username, setUsername] = useState('');return (<div><h1>受控組件入門</h1><label>用戶名:{/* 我們將在這里創建受控的 input */}</label><hr /><h3>你輸入的內容是: {username}</h3></div>);
}export default App;

第二步:創建受控的<input>

現在,我們來創建這個輸入框,并把它和我們的username State關聯起來。

修改return部分的代碼:

function App() {const [username, setUsername] = useState('');// 3. 定義 onChange 事件處理函數const handleUsernameChange = (event) => {// 4. 從事件對象中獲取輸入框的最新值const newValue = event.target.value;// 5. 更新 statesetUsername(newValue);};return (<div><h1>受控組件入門</h1><label>用戶名:<input type="text" // 1. 將 state 的值綁定到 input 的 valuevalue={username}// 2. 監聽 input 的內容變化onChange={handleUsernameChange}/></label><hr /><h3>你輸入的內容是: {username}</h3></div>);
}

代碼解釋(請嚴格按照數字順序理解):

  1. value={username}: 我們把username這個State的值,強制賦給了輸入框的value屬性。現在,這個輸入框顯示什么,完全由username決定。
  2. onChange={handleUsernameChange}: 我們監聽輸入框的change事件。只要用戶在里面打一個字,這個事件就會被觸發,并調用handleUsernameChange函數。
  3. 我們定義了handleUsernameChange函數。這個函數會自動接收一個事件對象 (event) 作為參數。
  4. event.target.value: 這是獲取輸入框當前值的標準方式。event.target指向觸發事件的DOM元素(也就是那個<input>),.value就是它的值。
  5. setUsername(newValue): 我們調用更新函數,把獲取到的新值賦給username這個State。

完整的流程閉環了!
用戶打字 -> onChange觸發 -> handleUsernameChange執行 -> setUsername更新State -> React重新渲染 -> 輸入框的value被更新為最新的State值。

第三步:測試效果

保存文件,回到瀏覽器。現在,嘗試在輸入框里打字。你會發現,下面的“你輸入的內容是:”那一行,會實時地、一字不差地顯示出你輸入的內容。

你已經成功掌握了受控組件!

為什么推薦使用受控組件?
  • 唯一數據源 (Single Source of Truth): 組件的狀態都由React State統一管理,代碼邏輯更清晰,調試更方便。
  • 實時校驗: 因為你能實時拿到輸入值,所以可以輕松地做一些即時校驗,比如限制輸入長度、禁止輸入特殊字符等。
  • 動態交互: 可以根據輸入的值,動態地改變其他UI元素的狀態,比如當密碼長度小于6位時,提交按鈕置灰。

處理多個輸入框

如果一個表單有多個輸入框(比如用戶名和密碼),難道要為每個輸入框都寫一個單獨的事件處理函數嗎?當然不用!我們可以用一個更巧妙的方式來處理。

實戰:一個簡單的登錄表單

import { useState } from 'react';
import './App.css';function App() {const [form, setForm] = useState({username: '',password: ''});const handleChange = (event) => {const { name, value } = event.target; // 解構獲取 name 和 valuesetForm(prevForm => ({...prevForm, // 復制舊的 form 對象[name]: value // 使用計算屬性名動態更新對應的字段}));};const handleSubmit = (event) => {event.preventDefault(); // 阻止表單默認的提交刷新行為alert(`登錄中... 用戶名: ${form.username}, 密碼: ${form.password}`);};return (<form onSubmit={handleSubmit}><h1>登錄表單</h1><div><label>用戶名:</label><input type="text" name="username" value={form.username} onChange={handleChange} /></div><div><label>密碼:</label><input type="password" name="password" value={form.password} onChange={handleChange} /></div><button type="submit">登錄</button></form>);
}export default App;

代碼解釋:

  1. 我們用一個對象來作為State,{username: '', password: ''}
  2. 給每個<input>添加了一個name屬性,且name的值與State對象中的鍵名完全對應
  3. 我們只用了一個handleChange函數。在函數內部,通過event.target.name可以知道是哪個輸入框觸發了事件,event.target.value是它的值。
  4. [name]: value 這是JavaScript的計算屬性名語法,它允許我們動態地設置對象的鍵。如果name"username",這就相當于username: value
  5. 我們用<form>onSubmit來處理表單的提交。event.preventDefault()是防止頁面刷新的關鍵。

總結與思考

今天,我們攻克了React中非常重要的一個環節——表單處理。你已經掌握了:

  1. 受控組件的核心概念:UI的值由React State控制。
  2. 如何使用useState, valueonChange三件套,實現對單個輸入框的控制。
  3. 如何用一個State對象和一個事件處理函數,優雅地管理多個輸入框。

現在,我們的應用已經可以和用戶進行深度的數據交互了。但是,我們所有的數據都還停留在前端。一個真正的應用,需要和后端服務器進行通信,去獲取和提交數據。

在下一篇文章 《React副作用處理:useEffect入門,組件加載后如何請求API數據?》 中,我們將學習如何使用useEffect這個強大的Hook,在組件渲染完成后去執行一些“副作用”操作,比如從一個公開的API獲取數據并展示在頁面上。我們下期再會!

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

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

相關文章

探索現代 Web 開發:從 HTML5 到 Vue.js 的全棧之旅

在當今快速發展的互聯網時代&#xff0c;Web 開發已經成為構建數字世界的重要基石。無論是企業級應用、社交媒體平臺&#xff0c;還是個人博客和電商平臺&#xff0c;Web 技術都在背后默默支撐著這些系統的運行。隨著前端技術的不斷演進&#xff0c;開發者們已經不再局限于傳統…

ElasticSearch聚合查詢從15秒到1.2秒的深度優化實踐

一、問題背景 在金融風控場景中,我們需要對90天內的交易數據進行多維度聚合分析(按風險等級、地區、金額分段等)。隨著數據量增長到日均3000萬+記錄,原有查詢響應時間逐漸惡化至15秒以上,嚴重影響了業務決策效率。 二、原始架構性能分析 1. 集群拓撲 # 原單節點配置 N…

2025.06.09【讀書筆記】|PromptBio:讓生信分析更簡單的AI平臺

文章目錄 一、PromptBio 是什么&#xff1f;二、主要功能介紹1. 對話式智能體&#xff0c;像聊天一樣做分析2. 自動化工作流&#xff0c;省時省力3. 數據管理一站式搞定4. 機器學習也能一鍵搞定5. “無代碼”到“全代碼”&#xff0c;人人都能用 三、適合哪些人用&#xff1f;四…

實戰解析:如何用克魔(KeyMob)等工具構建iOS應用穩定性與數據可觀測體系

在iOS開發項目逐漸走向復雜化的今天&#xff0c;團隊對“可觀測性”的要求正不斷提升。開發者不僅要知道App是否運行正常&#xff0c;更要明確“為什么異常、在哪里異常、是否可復現”。傳統的調試工具往往側重單一維度&#xff0c;要么是資源監控、要么是日志分析&#xff0c;…

如何輕松實現多源混算報表

報表作為綜合業務&#xff0c;數據來源多種多樣。傳統實現多源混合查詢報表要通過 ETL 將數據同庫&#xff0c;但這種方式數據時效性太差使用場景受限。通過邏輯數倉能獲得較強的數據實時性&#xff0c;但體系又過于沉重&#xff0c;為報表業務搭建邏輯數倉有點得不償失。需要一…

Docker|簡單入門

文章目錄 Docker簡介Docker和虛擬機的聯系和區別基本原理和概念鏡像容器倉庫 Docker安裝配置容器化和Dockerfile實踐環節Docker Compose Docker簡介 Docker是一個用于構建build、運行run、傳送share應用程序的平臺&#xff0c;可以把應用程序打包成一個個的集裝箱&#xff0c;…

阿里云云原生數據庫PolarDB和普通云數據庫的區別?

文章目錄 前言一、云數據庫的演進&#xff1a;從“托管”到“原生”的跨越二、PolarDB的核心創新&#xff1a;重新定義云數據庫的能力邊界1. 存算分離架構&#xff1a;打破資源綁定的“枷鎖”2. 多模引擎與兼容生態&#xff1a;降低應用遷移成本3. 智能化運維&#xff1a;讓數據…

SNN學習(4):真實的生物神經學中神經元和人腦結構學習

目錄 一、基礎知識 1 簡單神經元回路中的信號運作 2 高級功能相關的復雜神經元回路 3 細胞體、樹突和軸突 3.1 神經元細胞 3.2 非神經元細胞 3.3 神經膠質細胞 3.4 神經細胞的信號傳遞 3.4.1 動作電位的特性 3.4.2 興奮和抑制 3.4.3 電傳遞 二、大腦皮層及視覺系統…

第六天 界面操作及美化(6.1 建立菜單及異步調用)

6.1 建立菜單及異步調用 在程序中&#xff0c;菜單&#xff08;Menu&#xff09;是一種常見的用戶界面元素&#xff0c;在程序中起到了組織功能、提高用戶體驗、提供快捷方式和幫助文檔等重要作用。通過合理使用菜單&#xff0c;可以使程序的功能更加清晰、操作更加便捷&#…

論文解析:一文弄懂ResNet(圖像識別分類、目標檢測)

目錄 一、相關資源 二、Motivation 三、技術細節 1.殘差學習過程 2.快捷連接類型 (1)Identity Shortcuts&#xff08;恒等捷徑&#xff09; (2)Projection Shortcuts&#xff08;投影捷徑&#xff09; (3)兩種捷徑對比 3.深層瓶頸結構Deeper Bottleneck Architectures…

動態規劃算法的歡樂密碼(二):路徑問題

專欄&#xff1a;算法的魔法世界 個人主頁&#xff1a;手握風云 一、例題講解 1.1. 不同路徑 題目要求是計算從網格的左上角&#xff08;起點&#xff09;到右下角&#xff08;終點&#xff09;的所有不同路徑的數量。機器人每次只能向下或向右移動一步。如下圖所示&#xff0…

嵌入式相關開源項目、庫、資料------持續更新中

嵌入式相關開源項目、庫、資料------持續更新中 學習初期最難找的就是找學習資料了&#xff0c;本貼精心匯總了一些嵌入式相關資源&#xff0c;包括但不限于編程語言、單片機、開源項目、物聯網、操作系統、Linux、計算機等資源&#xff0c;并且在不斷地更新中&#xff0c;致力…

圖像處理與機器學習項目:特征提取、PCA與分類器評估

圖像處理與機器學習項目:特征提取、PCA與分類器評估 項目概述 本項目將完成一個完整的圖像處理與機器學習流程,包括數據探索、特征提取、主成分分析(PCA)、分類器實現和評估五個關鍵步驟。我們將使用Python的OpenCV、scikit-learn和scikit-image庫來處理圖像數據并實現機器…

MATLAB | 如何使用MATLAB獲取《Nature》全部繪圖 (附23-25年圖像)

文末有全部圖片資源 我在兩年前更過如何用 MATLAB 爬取 《Nature》全部插圖&#xff0c;最近又有人問我有沒有下載好的24&#xff0c;25年插圖的壓縮包&#xff0c;于是又去拿代碼運行了一下&#xff0c;發現兩年前寫的代碼今天居然還能用&#xff0c;代碼如下&#xff1a; f…

中國老年健康調查(CLHLS)數據挖掘教程(1)--CLHLS簡介和數據下載

北京大學“中國老年健康影響因素跟蹤調查&#xff08;簡稱‘中國老年健康調查’&#xff1b;英文名稱為Chinese Longitudinal Healthy Longevity Survey (CLHLS)&#xff09;”及交叉學科研究由國家自然科學基金委主任基金應急項目、重大項目、重點項目及國際合作項目。1998-20…

基本多線程編譯make命令

背景&#xff1a; 在ffmpeg源碼編譯的時候要等很久&#xff0c;快下班了&#xff0c;等不及。 解決方法&#xff1a; 使用多線程編譯。 make -j{n} 如&#xff1a; make -j8詳解&#xff1a;&#xff08;沒時間看的可以返回了&#xff01;&#xff09; 在編譯 FFmpeg 時使用…

MNIST數據集上樸素貝葉斯分類器(MATLAB例)

MNIST數據集上樸素貝葉斯分類器 Naive Bayes Classification fitcnb Train multiclass naive Bayes model Syntax Mdl fitcnb(Tbl,ResponseVarName) Mdl fitcnb(Tbl,formula) Mdl fitcnb(Tbl,Y) Mdl fitcnb(X,Y) Mdl fitcnb(___,Name,Value) [Mdl,AggregateOptimization…

網站設計小技巧:利用交互設計提升用戶體驗

現在很多企業朋友都會感覺到&#xff0c;做網站設計掌握不好設計網頁的魂&#xff0c;換了很多設計方式可能效果都不理想。蒙特網站專注高端網站建設20多年&#xff0c;基于為華為、字節跳動、海康威視等頭部企業打造網站的經驗&#xff0c;今天將近期用戶比較喜歡的網頁設計方…

Github指南-Add .gitignore和Choose a license

Add .gitignore&#xff08;添加忽略文件列表&#xff09; &#x1f4cc; 作用&#xff1a; .gitignore 文件用于告訴 Git 哪些文件或文件夾**不要被上傳&#xff08;版本控制&#xff09;**&#xff0c;例如&#xff1a; 編譯生成的臨時文件&#xff08;如 .exe, .o&#x…

如何打造沉浸式文件操作體驗

在操作系統長期運行后&#xff0c;本地文件系統往往會面臨一個常見卻棘手的問題&#xff1a;元數據管理效率下降&#xff0c;導致用戶在海量文件中檢索目標內容時出現顯著的延遲與操作成本。這種現象在未使用標簽化或語義化管理系統的情況下尤為明顯。 而 Oversis 的出現&…