非受控组件
表单数据交由DOM节点管理,特点是表单数据在需要时进⾏获取,代码实现相对简单。
示例代码:
import React, { useRef } from "react"
function App(){
const username = useRef()
const handleSubmit = event => {
event.preventDefault()
// 需要时获取数据
console.log(username.current.value)
}
return (
<form onSubmit={handleSubmit}>
<input type="text" ref={username} />
<input type="submit" />
</form>
)
}
export default App
受控组件
表单数据交由state对象管理,特点是可以实时得到表单数据,代码相对复杂。
import React, { useState } from "react"
function App(){
const [username, setUsername] = useState('')
const handleSubmit = event => {
event.preventDefault()
console.log(username)
}
const handleChange = event => {
// 同步到状态
setUsername(event.target.value)
}
return (
<form onSubmit={handleSubmit}>
<input type="text" value={username} onChange={handleChange} />
<input type="submit" />
</form>
)
}
export default App
选用标准
受控组件和⾮受控组件都有其特点,应该根据需求场进⾏选择;
在⼤多数情况下,推荐使⽤受控组件处理表单数据;
如果表单在数据交互⽅⾯⽐简单,使⽤⾮受控表单,否则使⽤受控表单;
场景 | ⾮受控 | 受控 |
表单提交时取值 | √ | √ |
表单提交时验证 | √ | √ |
表单项元素实时验证 | × | √ |
根据条件禁⽤提交按钮 | × | √ |
强制输⼊内容的格式 | × | √ |
⼀个数据的多个输⼊ | × | √ |