收集表单数据@10

组件分类

受控组件

受控组件是React官方推荐的表单处理方式。

特点

表单数据由React组件的state完全控制,每一个表单元素的值都绑定到组件的state上,并通过onChange事件处理器来更新state。

优势

1、数据可控性

所有输入变化都通过state管理,便于实现验证和格式化

2、实时反馈

可即时校验输入(如密码强度检测)

3、动态交互

支持表单字段联动(如选择国家后自动填充城市)

应用场景

  • 需要实时验证的表单(如登录、注册)
  • 动态表单(如多步骤向导)
  • 数据需要与其他组件状态同步的场景
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>2_受控组件</title>
</head>
<body>
	<!-- 准备好一个"容器" -->
	<div id="test"></div>
	
	<!-- 引入react核心库 -->
	<script type="text/javascript" src="../js/react.development.js"></script>
	<!-- 引入react-dom,用于支持react操作DOM -->
	<script type="text/javascript" src="../js/react-dom.development.js"></script>
	<!-- 引入babel,用于将jsx转为js -->
	<script type="text/javascript" src="../js/babel.min.js"></script>

	<script type="text/babel">
		//创建组件
		class Login extends React.Component{

			//初始化状态
			state = {
				username:'', //用户名
				password:'' //密码
			}

			//保存用户名到状态中
			saveUsername = (event)=>{
				this.setState({username:event.target.value})
			}

			//保存密码到状态中
			savePassword = (event)=>{
				this.setState({password:event.target.value})
			}

			//表单提交的回调
			handleSubmit = (event)=>{
				event.preventDefault() //阻止表单提交
				const {username,password} = this.state
				alert(`你输入的用户名是:${username},你输入的密码是:${password}`)
			}

			render(){
				return(
					<form onSubmit={this.handleSubmit}>
						用户名:<input onChange={this.saveUsername} type="text" name="username"/>
						密码:<input onChange={this.savePassword} type="password" name="password"/>
						<button>登录</button>
					</form>
				)
			}
		}
		//渲染组件
		ReactDOM.render(<Login/>,document.getElementById('test'))
	</script>
</body>
</html>

非受控组件

非受控组件允许表单数据由DOM自身管理,React通过ref直接访问DOM节点获取值。

个人理解,这种组件和传统HTML表单行为有点类似,代码量相对较少。

优势

  1. 代码简洁:无需定义state、事件处理逻辑
  2. 性能优化:减少非必要的重渲染
  3. 特殊场景 :文件上传(<input type="file">)必须使用非受控模式

应用场景

  • 简单表单(如《联系我们》页面)
  • 性能敏感场景(如大量输入框的表格)
  • 集成第三方库(如jQuery插件)
html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>1_非受控组件</title>
</head>
<body>
	<!-- 准备好一个"容器" -->
	<div id="test"></div>
	
	<!-- 引入react核心库 -->
	<script type="text/javascript" src="../js/react.development.js"></script>
	<!-- 引入react-dom,用于支持react操作DOM -->
	<script type="text/javascript" src="../js/react-dom.development.js"></script>
	<!-- 引入babel,用于将jsx转为js -->
	<script type="text/javascript" src="../js/babel.min.js"></script>

	<script type="text/babel">
		//创建组件
		class Login extends React.Component{
			handleSubmit = (event)=>{
				event.preventDefault() //阻止表单提交
				const {username,password} = this
				alert(`你输入的用户名是:${username.value},你输入的密码是:${password.value}`)
			}
			render(){
				return(
					<form onSubmit={this.handleSubmit}>
						用户名:<input ref={c => this.username = c} type="text" name="username"/>
						密码:<input ref={c => this.password = c} type="password" name="password"/>
						<button>登录</button>
					</form>
				)
			}
		}
		//渲染组件
		ReactDOM.render(<Login/>,document.getElementById('test'))
	</script>
</body>
</html>

区别

React受控组件和非受控组件之间的最大区别是组件的值是由React状态控制还是由DOM节点控制。

特性 受控组件 非受控组件
数据控制 React state DOM自身
更新方式 实时(onChange事件) 按需(如提交时通过ref获取)
代码复杂度 较高(需定义state和事件) 较低(直接操作DOM)
实时验证 支持 需手动实现
性能 频繁更新可能导致重渲染 减少不必要的重渲染
默认值设置 value属性 defaultValue或defaultChecked
相关推荐
_阿南_11 小时前
项目中新增给AI制定的代码规范
前端·程序员
名字还没想好☜12 小时前
React 实现暗黑模式切换:localStorage 持久化、SSR 首屏闪烁与跟随系统主题
前端·javascript·react.js·ecmascript·react·next.js
kruptos12 小时前
分布式系统怎么“选主“?Raft 共识一次讲清
开发语言·分布式·php·共识算法
吴声子夜歌13 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
自动化监测Learner13 小时前
主流 Web 端地图引擎对比:选型指南与优劣分析
javascript
console.log('npc')13 小时前
Git 冲突与 AI 协助指南
前端·人工智能·git·大模型
benchmark_cc14 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库14 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H14 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
泡海椒14 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp