# react 中的受控组件和非受控组件
react 中,受控组件指的是组件状态受我们控制的组件,非受控组件反之。
# 非受控组件
举个例子来说明,现在有一个组件包含一个输入框
function App() {
  return (
    <div className="App">
      <input />
    </div>
  );
}
1
2
3
4
5
6
7
2
3
4
5
6
7
这时候,输入框的值可以随着我们的输入而变化,也就是不受程序所控制,这就是非受控组件。
# 受控组件
当我们通过输入框的 value 属性和 onChange 事件来主动控制输入框的值
unction App() {
  const [val, setVal] = useState('hello');
  const handleChange = (e) => {
    setVal(e.target.value);
  };
  return (
    <div className="App">
      <input value={val} onChange={handleChange} />
    </div>
  );
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
这就是受控组件了。
- 优点:受控组件的值受我们控制,方便就行一些判断、验证、格式化或者触发一些副作用;
- 缺点:每次值得更新都会进行组件的重新渲染。
# 获得非受控组件中的值
这时候需要使用 ref 了。
class eForm extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
    this.input = React.createRef();
  }
  handleSubmit(event) {
    alert('A name was submitted: ' + this.input.current.value);
    event.preventDefault();
  }
  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" ref={this.input} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
也可以使用 useRef Hook
function App() {
  const inputEl = useRef(null);
  const handleClick = () => {
    alert('A name was submitted: ' + inputEl.current.value);
  };
  return (
    <div className="App">
      <input ref={inputEl} />
      <button onClick={handleClick}>Click</button>
    </div>
  );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
如果你需要指定一个默认值,而不需要控制之后的更新,可以使用 defaultValue 属性。
- 优点: 不会有一个实时更新触发渲染的过程;
- 缺点:值不受控制,不方便进行一下值的处理。
