受控组件 在HTML中 input textarea select 这些表单元素 可以根据用户的输入变更自身的状态 (数据) react中可变状态放在state中 把两者结合起来 让react的state成为单一数据源 这样的组件称为受控组件
简单来说 就是表单元素的value绑定state里面的属性 然后当表单的value更新state中的数据 即受控组件就是state控制的组件
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
class Input extends Component{
constructor(){
super()
this.state = {
val:100
}
}
render(){
return(<div>
<input type = "text" value = {this.state.val} onChange = {this.changeVal}/>
<p>{this.state.val}</p>
</div>)
}
}
ReactDOM.render(<Input />, document.querySelector('#root'))
非受控组件 不受react控制的组件 value值在DOM元素上 此时需要用ref获取表单元素的值
- ref 是react 提供的用来操作DOM的 使用ref 需创建ref 然后在被获取的DOM对象上使用ref即可 创建ref 在构造函数中创建Ref
- 非受控组件 通过ref 获取DOM 元素 然后通过value属性获取该表单元素的值
import React, { Component } from 'react'
import ReactDOM from 'react-dom'
class Sum extends Component {
constructor () {
super()
this.state = {
num: 0
}
this.myRefA = React.createRef() // 创建 ref,在构造函数中创建 ref
// this.myRefB = React.createRef()
}
changeState = () => {
// 使用 ref :当组件挂载后,通过 ref 属性的 current 属性访问该 DOM 元素
// this.myRefA.current 就是 第一个 input
// this.myRefB.current 就是 第二个 input
// console.log(this.myRefA.current)
let num = +this.myRefA.current.value + +this.myRefB.current.value;
this.setState({
num
})
}
render () {
return (<div onChange={this.changeState}>
{/*在 DOM 元素中使用 ref,ref 的值是上面创建的 ref*/}
<input type="text" ref={this.myRefA} /> <br/>
{/*ref 第二种形式,设置一个箭头函数,this.myRefB 就是第二个 input 的 ref,el 就是这个 input,这个函数会在组件挂载后执行,执行后在父组件的 this 上的 myRefB 就是这个 input 元素了*/}
<input type="text" ref={(el) => {this.myRefB = el} } />
<p>{this.state.num}</p>
</div>)
}
}
ReactDOM.render(<Sum />, document.getElementById('root'))