收集表单数据@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
相关推荐
青春易逝丶2 小时前
策略模式
java·开发语言·策略模式
freexyn2 小时前
Matlab入门自学七十四:坐标系转换,直角坐标、极坐标和球坐标的转换
开发语言·算法·matlab
贼爱学习的小黄2 小时前
NC BIP参照开发
java·前端·nc
weixin_462901972 小时前
ESP32 LED控制代码解析
javascript
小江的记录本2 小时前
【MyBatis-Plus】MyBatis-Plus的核心特性、条件构造器、分页插件、乐观锁插件
java·前端·spring boot·后端·sql·tomcat·mybatis
小张会进步2 小时前
数组:二维数组
java·javascript·算法
光影少年2 小时前
如何进行前端性能优化?
前端·性能优化
Dxy12393102162 小时前
js如何把字符串转数字
开发语言·前端·javascript
爱写bug的野原新之助2 小时前
爬虫之补环境:加载原型链
前端·javascript·爬虫
陈广亮2 小时前
工具指南7-Unix时间戳转换工具
前端