React
要编写一个非受控组件, 可以使用 ref
来从 DOM
节点中获取表单数据, 就是非受控组件。例如, 下面的代码使用非受控组件接受一个表单的值:
class NameForm 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 (
);
}
}
因为非受控组件将真实数据储存在 DOM
节点中, 所以在使用非受控组件时, 有时候反而更容易同时集成 React
和非 React
代码。如果你不介意代码美观性, 并且希望快速编写代码, 使用非受控组件往往可以减少你的代码量。否则, 你应该使用受控组件。
在 React
渲染生命周期时, 表单元素上的 value
将会覆盖 DOM
节点中的值, 在非受控组件中, 你经常希望 React
能赋予组件一个初始值, 但是不去控制后续的更新。在这种情况下, 你可以指定一个 defaultValue
属性, 而不是 value
。
render(){
return (
);
}
同样, 和
支持
defaultChecked
, 和
支持
defaultValue
。
class NameForm extends React.Component {
constructor(props) {
super(props);
this.state = {value: ''};
this.handleChange = this.handleChange.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
}
handleChange(event) {
this.setState({value: event.target.value});
}
handleSubmit(event) {
alert('提交的名字: ' + this.state.value);
event.preventDefault();
}
render() {
return (
);
}
}
由于在表单元素上设置了 value
属性, 因此显示的值将始终为 this.state.value
, 这使得 React
的 state
成为 唯一数据源。由于 handlechange
在每次按键时都会执行并更新 React
的 state
, 因此显示的值将随着用户输入而更新。
对于受控组件来说, 输入的值始终由 React
的 state
驱动。你也可以将 value
传递给其他 UI
元素, 或者通过其他事件处理函数重置, 但这意味着你需要编写更多的代码。
注意: 另一种说法(广义范围的说法),
React
组件的数据渲染是否被调用者传递的props
完全控制, 控制则为受控组件, 否则非受控组件。