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

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