我们将讨论如何在 React 中使用表单单元素与 Reac

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 /> );

https://avg.163.com/topic/detail/9240046
https://avg.163.com/topic/detail/9240085
https://avg.163.com/topic/detail/9240116
https://avg.163.com/topic/detail/9240160
https://avg.163.com/topic/detail/9240195
https://avg.163.com/topic/detail/9240045
https://avg.163.com/topic/detail/9240084
https://avg.163.com/topic/detail/9240115
https://avg.163.com/topic/detail/9240144
https://avg.163.com/topic/detail/9240043
https://avg.163.com/topic/detail/9240086
https://avg.163.com/topic/detail/9240118
https://avg.163.com/topic/detail/9240146
https://avg.163.com/topic/detail/9240174
https://avg.163.com/topic/detail/9240044
https://avg.163.com/topic/detail/9240088
https://avg.163.com/topic/detail/9240124
https://avg.163.com/topic/detail/9240158
https://avg.163.com/topic/detail/9240193
https://avg.163.com/topic/detail/9234504
https://avg.163.com/topic/detail/9234511
https://avg.163.com/topic/detail/9234496
https://avg.163.com/topic/detail/9234503
https://avg.163.com/topic/detail/9234509
https://avg.163.com/topic/detail/9234493
https://avg.163.com/topic/detail/9234491
https://avg.163.com/topic/detail/9234501
https://avg.163.com/topic/detail/9234508
https://avg.163.com/topic/detail/9234494
https://avg.163.com/topic/detail/9234499
https://avg.163.com/topic/detail/9234507
https://avg.163.com/topic/detail/9234495
https://avg.163.com/topic/detail/9234506
https://avg.163.com/topic/detail/9234492
https://avg.163.com/topic/detail/9234486
https://avg.163.com/topic/detail/9234487
https://avg.163.com/topic/detail/9234488

多个表单

当你有处理多个 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 实例

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/1215431.shtml

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

相关文章

数据变化(原始数据—数据清洗—特征工程)

数据清洗步骤 用户行为数据缺失值处理 user_id、item_id是关联用户和商品的唯一标识&#xff0c;缺失后无法建立有效关联behavior_type是核心行为标签&#xff0c;缺失无法定义交互类型timestamp是时间序列分析的基础&#xff0c;缺失影响序列特征的准确性直接删除比填充更可靠…

Emacs 折腾日记(三十五)——归档

在前几篇文章中,我们经历了 GTD 流程中的收集想法、制定计划、以及执行和记录计划的过程,现在我们继续后续的流程,也就是最后的回顾和归档。 当日回顾 在我个人实践 GTD 的流程中,前一晚会做这些事情:回顾一下今天…

2026 年 1 月投饵船厂家推荐排行榜,无人投饵船,自动投饵船,遥控投饵船,智能投料船,水产养殖自动化精准投喂解决方案精选

2026年1月投饵船厂家推荐排行榜:水产养殖自动化精准投喂解决方案精选 随着全球水产养殖业向集约化、智能化方向加速转型,传统依赖人工作业的投喂模式正面临效率瓶颈、成本高企与精准度不足等多重挑战。在此背景下,以…

2026 年 1 月液相色谱厂家推荐排行榜,色谱柱/液相色谱仪/二维液相色谱/UPLC/制备液相色谱,精准分离分析技术源头实力解析

2026 年 1 月液相色谱厂家推荐排行榜:色谱柱/液相色谱仪/二维液相色谱/UPLC/制备液相色谱,精准分离分析技术源头实力解析 在生命科学、药物研发、食品安全、环境监测等众多前沿与基础研究领域,液相色谱技术作为不可…

xFUZZ: A Flexible Framework for Fine-Grained, Runtime-Adaptive Fuzzing Strategy Composition

概要:现有灰盒模糊测试工具要么策略固定、要么只能整工具切换,无法随目标程序和测试阶段 的变化而细粒度、运行时地调整策略;我们提出 xFUZZ,首次把输入调度、变异调度等核 心组件全部做成可热插拔的插件,并用滑动…

2026 年 1 月古建瓦厂家推荐排行榜,中式古建瓦,园林古建瓦,仿古瓦定制,古建瓦供应,匠心传承与建筑美学融合之选

2026年1月古建瓦厂家推荐排行榜:中式古建瓦、园林古建瓦、仿古瓦定制与供应的匠心之选 在当代建筑文化复兴与文旅产业蓬勃发展的浪潮下,古建瓦作为承载中式建筑灵魂的重要构件,其市场需求持续升温。无论是历史古迹的…

【VLM】Visual Merit or Linguistic Crutch? 看DeepSeek-OCR

note 论文证明了 DeepSeek-OCR 的强性能很大程度上来自语言模型的“语言先验”&#xff0c;而非真正的深度视觉理解&#xff0c;并指出这种依赖使得它在语义扰动或超长上下文下表现脆弱。 文章目录note一、Visual Merit or Linguistic Crutch?二、实验RQ1&#xff1a;句子级语…

Go进阶之反射

Go语言是静态类型语言.比如int float32 []byte32等等.每个变量都有一个静态类型.并且在编译的时候就已经确定了.type Myint int var i int var j Myint变量i和j不是相同类型.因为二者拥有不同的静态类型.尽管二者底层的类型都是int.但在没有类型转换的情况下是不可以相互赋值的…

2026 年 1 月仿古瓦厂家推荐排行榜,中式仿古瓦,小青瓦仿古瓦,定制仿古瓦,古建屋面瓦公司推荐,甄选匠心工艺与耐久品质!

2026年1月仿古瓦厂家推荐排行榜:甄选匠心工艺与耐久品质 随着文化自信的回归与文旅产业的蓬勃发展,中式仿古建筑及传统风貌街区建设迎来了新一轮热潮。作为承载建筑神韵与历史文脉的关键元素,仿古瓦,尤其是中式仿古…

.bat脚本新建文件夹【项目结构】

一、源码 当有原来的同名文件时保留原来的文件夹【仅限文件夹同名保留】 NewFile.bat echo off chcp 65001 > nul 2>&1 setlocal enabledelayedexpansion:: 获取脚本所在的文件夹路径 set "script_dir%~dp0" echo echo 目标创建路径&#xff1a;%script_…

2026 年 1 月工业醇类及溶剂厂家推荐榜单:乙醇/无水乙醇/二丙酮醇/异丙醇/乙二醇/正丁醇/工业酒精/甲醇/醇酸漆稀释剂/丙二醇甲醚等源头实力厂家精选

2026 年 1 月工业醇类及溶剂厂家推荐榜单:乙醇/无水乙醇/二丙酮醇/异丙醇/乙二醇/正丁醇/工业酒精/甲醇/醇酸漆稀释剂/丙二醇甲醚等源头实力厂家精选 在精细化工与制造业的庞大体系中,工业醇类及溶剂扮演着不可或缺的…

2025年教我学英语 - 穿、衣

2025年教我学英语 - 穿、衣1、穿、戴 - wear [weə(r)] 穿、着 - put on [ˈpʊt ɒn] 穿、戴(状态)-dress [dres] 穿、套 - wear in [ˈweə(r) ɪn] 试穿 - try on [ˈtraɪ ɒn]2、衣服 - clothes [kləʊz] 外套…

探索Matlab水下图像处理与GUI界面构建之旅

数字图像处理matlab水下图像处理&#xff0c;gui 界面运用&#xff0c;有讲解报告 在数字图像处理的广袤领域中&#xff0c;水下图像处理因其独特的挑战而备受关注。Matlab作为一款强大的工具&#xff0c;为我们解决水下图像处理难题提供了丰富的资源和便捷的途径。同时&#…

快过年了 , 我就简简单单写一个总结吧 ! | 马年快乐 !

1. 项目正式上线了 书接上回 , 经过一个月的不懈努力 , 我和另一个哥们终于把这个项目 (帮学校做校园宿舍报修系统小程序) 拿下了. 但是这边宿管长这边又出了点状况: 因为这个项目是为学校做公益,没有问宿管长要一分钱. 但是服务器的钱肯定是要宿管长联系学校那边给报销一下…

FPGA FFT缩放因子配置全解析

目录 前言 1.快速傅里叶变换&#xff08;FFT&#xff09; 1.1 FFT的来源 1.2 FFT IP 缩放因子设置实例 缩放配置的底层含义&#xff1a;16haaaa 每一级的计算与“减肥”过程 输入准备&#xff1a;24 位原始数据 Stage 1&#xff1a;第一次蝶形运算 Stage 2&#x…

线程并行控制CompletableFuture

并行执行两个任务A和B。主线程等待时间最长为3s。所以A和B&#xff0c;单独运行的时长最长也是3s。 且如果A和B都没有超时&#xff0c;那么优先取A的值。否者谁不超时&#xff0c;就取谁。 线程池单个提交 比如下面的代码&#xff0c;先提交了两个异步任务&#xff0c;此时都…

2026 年 1 月酯类溶剂厂家推荐排行榜,正丙酯/乙酯/丁酯/醋酸丁酯/乙酸乙酯/丙二醇甲醚醋酸酯/工业碳酸二甲酯/精甲酯,高纯度环保溶剂实力供应商精选

2026 年 1 月酯类溶剂厂家推荐排行榜:高纯度环保溶剂实力供应商精选 在精细化工、涂料油墨、电子清洗、医药合成等众多现代工业领域,酯类溶剂扮演着不可或缺的角色。正丙酯、乙酸乙酯、醋酸丁酯、丙二醇甲醚醋酸酯(…