# 受控组件与非受控组件

# 受控组件

受控组件:在 HTML 表单中,通常我们自己维护一套 state,并随着用户的输入自动进行 UI 上更新,这种行为不受我们程序控制,如果将 React 里的 state 属性和表单元素的值建立依赖关系,在通过 onChange 事件与 setState 结合更新 state 属性,就能达到控制用户输入过程中表单发生的操作,这种方式控制表单取值的方式叫做 “受控组件”。

class Test extends React.Component {
  constructor() {
    this.state = {
      name: 'name'
    }
  }

  onChange(e) {
    this.state({
      name: e.target.value
    })
  }

  render() {
    return (
      <input name='name' value={this.state.name} onChange={(e) => this.onChange(e)}></input>
    )
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 非受控组件

class Test extends React.Component {
  constructor() {
    this.inputRef = React.createRef()
  }

  handleSubmit() {
    console.log(this.inputRef.current.value)
  }

  render() {
    return (
      <div>
        <input ref={this.inputRef}></input>
        <button onClick={() => this.handleSubmit()}>提交</button>
      </div>
    )
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • 但是:表单里面也有个例外,就是 files 文件,必须要用 非受控组件的 方式