一,非受控组件
表单中的数据在需要的时候“现用现取”(通过ref获得到节点,进而访问到value)
- 受控指的是受到状态state的控制
- 使用ref属性
<body>
<div id="test"></div>
<script type="text/babel">
class Demo extends React.Component {
render(){
return (
<form onSubmit = {this.handleLogin}>
姓名:<input type='text' ref={curNode => this.userNameNode = curNode}/>
密码:<input type='password' ref = {curNode => this.passwordNode = curNode}/>
<button>提交</button>
</form>
)
}
handleLogin = event=>{
event.preventDefault()
console.log(this)
const {userNameNode, passwordNode} = this
alert(`姓名为${userNameNode.value},密码为${passwordNode.value}`)
}
}
ReactDOM.render(<Demo/>, document.getElementById('test'))
</script>
</body>
</html>
二,受控组件
表单中输入类DOM(input checkbox select等)随着用户的输入,将值收集到state中,那么就成为受控组件
- 给A元素绑定事件,拿的是A元素
<body>
<div id="test"></div>
<script type="text/babel">
class Demo extends React.Component {
state = {
userName: '',
password: ''
}
render(){
return (
<form onSubmit = {this.handleLogin}>
姓名:<input type='text' onChange={this.saveUserName} />
密码:<input type='password' onChange={this.savePassword} />
<button>提交</button>
</form>
)
}
// 保存用户名到state中
saveUserName = event=>{
this.setState({userName: event.target.value})
}
// 保存密码到state中
savePassword = event=>{
this.setState({password: event.target.value})
}
handleLogin = event=>{
event.preventDefault()
console.log(this)
const {userName, password} = this.state
alert(`姓名为${userName},密码为${password}`)
}
}
ReactDOM.render(<Demo/>, document.getElementById('test'))
</script>
</body>
三,小知识点
-
onChange方法监控input输入框改变
-
event.target是发生事件的事件源,每次在输入框中输入内容,就会获取到事件源
什么时候不使用ref?
发生事件的事件源和获取事件是同一个,使用event.target可以获取到元素上的属性,此时不使用ref(比如给A绑定事件,恰巧拿的是A元素上的属性)
当给按钮B绑定事件,获取输入框A中的属性,此时需要借助ref实现
<div id="test"></div>
<script type="text/babel">
class Demo extends React.Component {
render(){
return (
<form onSubmit = {this.handleLogin}>
姓名:<input type='text' onChange={this.demo} />
密码:<input type='password' />
<button>提交</button>
</form>
)
}
demo(event){
console.log(event.target)
}
handleLogin = event=>{
event.preventDefault()
console.log(this)
}
}
ReactDOM.render(<Demo/>, document.getElementById('test'))

浙公网安备 33010602011771号