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, value和onChange三件套,实现对单个输入框的控制。
  3. 如何用一个State对象和一个事件处理函数,优雅地管理多个输入框。

现在,我们的应用已经可以和用户进行深度的数据交互了。但是,我们所有的数据都还停留在前端。一个真正的应用,需要和后端服务器进行通信,去获取和提交数据。

在下一篇文章 《React副作用处理:useEffect入门,组件加载后如何请求API数据?》 中,我们将学习如何使用useEffect这个强大的Hook,在组件渲染完成后去执行一些“副作用”操作,比如从一个公开的API获取数据并展示在页面上。我们下期再会!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/909314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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 的出现&…