HTML 表单元素与 React 中的其他 DOM 元素有所不同

React 表单与事件

本章节我们将讨论如何在 React 中使用表单。

HTML 表单元素与 React 中的其他 DOM 元素有所不同,因为表单元素生来就保留一些内部状态。

在 HTML 当中,像 <input>, <textarea>, 和 <select> 这类表单元素会维持自身状态,并根据用户输入进行更新。但在React中,可变的状态通常保存在组件的状态属性中,并且只能用 setState() 方法进行更新。

一个简单的实例

在实例中我们设置了输入框 input 值value = {this.state.data}。在输入框值发生变化时我们可以更新 state。我们可以使用onChange事件来监听 input 的变化,并修改 state。

React 实例

class HelloMessage extends React.Component { constructor(props) { super(props); this.state = {value: 'Hello Runoob!'}; this.handleChange = this.handleChange.bind(this); } handleChange(event) { this.setState({value: event.target.value}); } render() { var value = this.state.value; return <div> <input type="text" value={value} onChange={this.handleChange} /> <h4>{value}</h4> </div>; } } const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <HelloMessage /> );


尝试一下 »

上面的代码将渲染出一个值为 Hello Runoob! 的 input 元素,并通过 onChange 事件响应更新用户输入的值。

实例 2

在以下实例中我们将为大家演示如何在子组件上使用表单。onChange方法将触发 state 的更新并将更新的值传递到子组件的输入框的value上来重新渲染界面。

你需要在父组件通过创建事件句柄 (handleChange) ,并作为 prop (updateStateProp) 传递到你的子组件上。

React 实例

class Content extends React.Component { render() { return ( <div> <input type="text" value={this.props.myDataProp} onChange={this.props.updateStateProp} /> <h4>{this.props.myDataProp}</h4> </div> ); } } class HelloMessage extends React.Component { constructor(props) { super(props); this.state = { value: 'Hello Runoob!' }; this.handleChange = this.handleChange.bind(this); } handleChange(event) { this.setState({ value: event.target.value }); } render() { var value = this.state.value; return ( <div> <Content myDataProp={value} updateStateProp={this.handleChange} /> </div> ); } } const root = ReactDOM.createRoot(document.getElementById('root')); root.render(<HelloMessage />);


尝试一下 »

Select 下拉菜单

在 React 中,不使用 selected 属性,而在根 select 标签上用 value 属性来表示选中项。

React 实例

class FlavorForm extends React.Component { constructor(props) { super(props); this.state = {value: 'coconut'}; this.handleChange = this.handleChange.bind(this); this.handleSubmit = this.handleSubmit.bind(this); } handleChange(event) { this.setState({value: event.target.value}); } handleSubmit(event) { alert('Your favorite flavor is: ' + this.state.value); event.preventDefault(); } render() { return ( <form onSubmit={this.handleSubmit}> <label> 选择您最喜欢的网站 <select value={this.state.value} onChange={this.handleChange}> <option value="gg">Google</option> <option value="rn">Runoob</option> <option value="tb">Taobao</option> <option value="fb">Facebook</option> </select> </label> <input type="submit" value="提交" /> </form> ); } } const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <FlavorForm /> );


尝试一下 »

多个表单

当你有处理多个 input 元素时,你可以通过给每个元素添加一个 name 属性,来让处理函数根据 event.target.name 的值来选择做什么。

React 实例

class Reservation extends React.Component { constructor(props) { super(props); this.state = { isGoing: true, numberOfGuests: 2 }; this.handleInputChange = this.handleInputChange.bind(this); } handleInputChange(event) { const target = event.target; const value = target.type === 'checkbox' ? target.checked : target.value; const name = target.name; this.setState({ [name]: value }); } render() { return ( <form> <label> 是否离开: <input name="isGoing" type="checkbox" checked={this.state.isGoing} onChange={this.handleInputChange} /> </label> <br /> <label> 访客数: <input name="numberOfGuests" type="number" value={this.state.numberOfGuests} onChange={this.handleInputChange} /> </label> </form> ); } }


尝试一下 »


React 事件

以下实例演示通过 onClick 事件来修改数据:

React 实例

class HelloMessage extends React.Component { constructor(props) { super(props); this.state = {value: 'Hello Runoob!'}; this.handleChange = this.handleChange.bind(this); } handleChange(event) { this.setState({value: '菜鸟教程'}) } render() { var value = this.state.value; return <div> <button onClick={this.handleChange}>点我</button> <h4>{value}</h4> </div>; } } const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <HelloMessage /> );


尝试一下 »

当你需要从子组件中更新父组件的state时,你需要在父组件通过创建事件句柄 (handleChange) ,并作为 prop (updateStateProp) 传递到你的子组件上。实例如下:

React 实例

bbs.ys4fun.com/posts/370807
bbs.ys4fun.com/posts/370805
bbs.ys4fun.com/posts/370806
bbs.ys4fun.com/posts/370809
bbs.ys4fun.com/posts/370808
bbs.ys4fun.com/posts/370810
bbs.ys4fun.com/posts/370812
bbs.ys4fun.com/posts/370811
bbs.ys4fun.com/posts/370813
bbs.ys4fun.com/posts/370814
bbs.ys4fun.com/posts/370815
bbs.ys4fun.com/posts/370816
bbs.ys4fun.com/posts/370817
bbs.ys4fun.com/posts/370818
bbs.ys4fun.com/posts/370819
bbs.ys4fun.com/posts/370820
bbs.ys4fun.com/posts/370821
bbs.ys4fun.com/posts/370822
bbs.ys4fun.com/posts/370823
bbs.ys4fun.com/posts/370824
bbs.ys4fun.com/posts/370825
bbs.ys4fun.com/posts/370826
bbs.ys4fun.com/posts/370827
bbs.ys4fun.com/posts/370829
bbs.ys4fun.com/posts/370828

class Content extends React.Component { render() { return <div> <button onClick = {this.props.updateStateProp}>点我</button> <h4>{this.props.myDataProp}</h4> </div> } } class HelloMessage extends React.Component { constructor(props) { super(props); this.state = {value: 'Hello Runoob!'}; this.handleChange = this.handleChange.bind(this); } handleChange(event) { this.setState({value: '菜鸟教程'}) } render() { var value = this.state.value; return <div> <Content myDataProp = {value} updateStateProp = {this.handleChange}></Content> </div>; } } const root = ReactDOM.createRoot(document.getElementById("root")); root.render( <HelloMessage />

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2026年最好用的六大代理IP服务商推荐:IPIDEA、Decodo、Smartproxy、IPRoyal、SOAX、Oxylabs

一、IPIDEA&#xff1a;IPIDEA是一家面向企业级AI训练与数据采集场景的全球代理服务商&#xff0c;其技术架构以超1亿高质量代理IP组成的庞大资源池为核心&#xff0c;覆盖全球220多个国家和地区&#xff0c;提供动态/静态住宅代理、移动代理及数据中心代理等全类型服务。IPIDE…

indirectly_readable和indirectly_writable这两个核心概念的具体定义和使用场景是什么?

indirectly_readable 和 indirectly_writable 是 C20 中引入的两个核心概念&#xff0c;它们为迭代器操作提供了基础的类型安全约束&#xff0c;是理解现代 C 范围库和算法库的关键。 下面这个表格能帮你快速把握它们的核心区别&#xff1a;特性indirectly_readableindirectly_…

超绝好用清理软件工具,(附下载方式)超多好用功能

电脑用久了&#xff0c;难免会堆积闲置软件、捆绑程序&#xff0c;自带卸载工具往往 “卸不干净”&#xff0c;残留的文件碎片和注册表垃圾不仅占用磁盘空间&#xff0c;还可能拖慢系统运行。今天给大家实测推荐三款 Windows 平台口碑爆棚的卸载工具 ——HiBit Uninstaller、Ge…

数据库分片和分区

1.分片Database Sharding是一种 水平拆分&#xff08;Horizontal Partitioning&#xff0c;按行拆分&#xff09; 的方案&#xff0c;用来解决单机数据库在数据量、并发量上的瓶颈问题。&#xff08;垂直拆分是指按列的字段拆分。&#xff09;一句话定义&#xff1a;把同一张逻…

何为Transformer 架构?

何为Transformer 架构&#xff1f;最后 选择AI大模型就是选择未来&#xff01;最近两年&#xff0c;大家都可以看到AI的发展有多快&#xff0c;时代在瞬息万变&#xff0c;我们又为何不给自己多一个选择&#xff0c;多一个出路&#xff0c;多一个可能呢&#xff1f; 与其在传统…

HiBit Uninstaller全攻略:轻量无广,彻底告别软件残留(附下载方式)

一、软件简介&#xff1a;为何它能成为系统清理神器&#xff1f;HiBit Uninstaller是由HiBit Software开发的免费Windows系统卸载工具&#xff0c;自2017年发布以来&#xff0c;凭借轻量、高效、无广告的特性&#xff0c;在同类工具中脱颖而出&#xff0c;成为普通用户与IT维护…

电阻的基础知识

电阻与电容、电感一样都是最基本的元器件&#xff0c;大量使用于各种电气或电子设备中。对从事电气工作的人而言或许过于普通&#xff0c;平时忽视了它&#xff0c;但如果没有电阻&#xff0c;电气或电子电路就无法建立。电阻就是如此重要的元器件。 电阻的作用电阻是具有一定电…

jvm性能调优

JVM性能调优方法调整堆内存大小 -Xms和-Xmx参数分别设置JVM堆的初始大小和最大大小。建议将两者设为相同值以避免运行时动态调整带来的性能开销。例如&#xff1a; -Xms4g -Xmx4g 根据应用需求调整大小&#xff0c;避免频繁Full GC。选择合适的垃圾回收器 根据应用特点选择垃圾…

【光子AI】FastAPI 极简权威指南 (The Ultimate Minimalist Guide)

这是一个 FastAPI 深度极简教程。虽然篇幅受限于输出长度,但这篇指南涵盖了从入门到生产环境部署的核心知识体系,内容密度相当于一本 10,000 字的技术手册的精华浓缩版。 我们将从零开始,逐步构建一个现代化的、高性能的 Web API。 FastAPI 极简权威指南 (The Ultimate Min…

【光子AI】FastAPI 极简教程(从 0 到 生产级)

FastAPI 极简教程&#xff08;从 0 到 生产级&#xff09; 本教程面向 Python Web / 后端 / AI 工程师&#xff0c;目标是&#xff1a; 用最少的概念&#xff0c;建立正确的 FastAPI 心智模型从 0 写到 可上线的工程结构讲清楚 async / event loop / 并发模型 / 性能边界 全文偏…

mysql一条sql语句是如何运行的

MySQL SQL 语句执行流程MySQL 执行一条 SQL 语句的过程可以分为多个阶段&#xff0c;包括连接管理、解析与优化、执行引擎处理以及结果返回。以下是详细流程&#xff1a;连接管理客户端通过 TCP/IP 或 Unix Socket 连接到 MySQL 服务器。连接建立后&#xff0c;服务器进行身份验…

MySQL 8.0在windows环境安装及配置

文章目录 一、下载二、安装三、配置环境变量 一、下载 1、先彻底卸载之前的MySQL&#xff0c;并清理其 残留文件 。 2、登录网址https://www.mysql.com/ 3、点击网址左下角“中文”按钮&#xff0c;切换到中文界面 4、点击网页上方的“下载”按钮&#xff0c;然后点击网…

什么是勒索软件即服务(RaaS)

文章目录勒索软件即服务的影响勒索软件即服务是如何运作的勒索软件即服务典型案例华为如何帮助您抵御勒索软件即服务勒索软件即服务RaaS&#xff08;Ransomware as a Service&#xff09;是一种网络犯罪商用模式&#xff0c;犯罪组织采用软件即服务&#xff08;SaaS&#xff09…

什么是立体射频调优

文章目录传统射频调优算法存在哪些不足立体射频调优算法如何解决这些问题立体射频调优适用于哪些场景立体射频调优是在传统射频调优的基础上进行的算法优化&#xff0c;能够基于终端上报的RSSI测量结果识别AP高挂、AP间存在遮挡等复杂安装场景&#xff0c;并对发射功率和信道进…

【计算机毕业设计案例】基于深度学习CNN的水果识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

什么是零漫游分布式AP

文章目录为什么需要分布式AP分布式AP如何组网分布式架构如何实现零漫游Wi-Fi 7零漫游 vs Wi-Fi 6零漫游零漫游分布式 vs 敏捷分布式零漫游分布式Wi-Fi解决方案相关产品零漫游分布式AP&#xff08;Distributed Access Point&#xff0c;简称分布式AP或DAP&#xff0c;在新一代的…

什么是零日攻击

文章目录什么是零日漏洞零日漏洞是如何转化为零日攻击的为什么零日攻击很危险著名的零日攻击事件如何降低零日攻击的风险华为如何帮助您抵御零日攻击零日漏洞通常是指还没有补丁的安全漏洞&#xff0c;零日攻击则是指利用零日漏洞对系统或软件应用发动的网络攻击。由于零日漏洞…

全网最全9个AI论文平台,专科生毕业论文写作必备!

全网最全9个AI论文平台&#xff0c;专科生毕业论文写作必备&#xff01; 1.「千笔」—— 一站式学术支持“专家”&#xff0c;从初稿到降重一步到位&#xff08;推荐指数&#xff1a;★★★★★&#xff09; 在众多AI论文平台中&#xff0c;「千笔」凭借其强大的功能和贴心的服…

MySQL 实验1:Windows 环境下 MySQL5.5 安装与配置

MySQL 实验1&#xff1a;Windows 环境下 MySQL5.5 安装与配置 目录 MySQL 实验1&#xff1a;Windows 环境下 MySQL5.5 安装与配置 一、MySQL 软件的下载二、安装 MySQL三、配置 MySQL 1、配置环境变量2、安装并启动 MySQL 服务3、设置 MySQL 字符集4、为 root 用户设置登录密…

MacOs安装Redis并设置为开机、后台启动

前言 最近闲来无事&#xff0c;将自己的MBP系统重装里&#xff0c;导致里面原来安装的软件都需要重新安装&#xff0c;今天记录一下MacOs安装Redis并设置为开机启动、后台启动的步骤&#xff0c;安装过程略有波折&#xff0c;参考里几篇文章才搞定。 一、安装Redis 两种方式…