React.js中不受控制的组件

在受控组件形式中,数据由React组件通过编写事件处理程序进行状态更新来处理。但是在不受控制的组件中,表单数据由DOM本身处理。

ref用于从DOM接收表单值。

示例

class UserNameForm extends React.Component {
   constructor(props) {
      super(props);
      this.handleFormSubmit = this.handleFormSubmit.bind(this);
      this.inputUserName = React.createRef();
   }
   handleFormSubmit(event) {
      console.log('username: ' + this.inputUserName.current.value);
      event.preventDefault();
   }
   render() {
      return (
         <form onSubmit={this.handleFormSubmit}>
            <label>
               Name:
               <input type="text" ref={this.inputUserName} />
            </label>
            <input type="submit" value="Submit" />
         </form>
      );
   }
}

Reacts createRef函数为表单字段创建引用,在表单提交时,我们可以使用this.inputUserName.current .value来访问字段值。注意在引用名称之后使用current

这是一种快速而又肮脏的解决方案,它实际上具有较少的代码,但具有较少的控制。

对于不受控制的组件,React提供了一个称为defaultValue的属性,以将初始值提供给form字段。

render() {
   return (
      <form onSubmit={this.handleFormSubmit}>
         <label>
            User Name:
            <input
               defaultValue="Steve"
               type="text"
               ref={this.inputUserName} />
         </label>
         <input type="submit" value="Submit" />
      </form>
   );
}

输入类型文件始终是不受控制的组件,因为其值只能由用户设置,而不能通过编程设置。

示例

文件输入示例-

class FileInputExample extends React.Component {
   constructor(props) {
      super(props);
      this.handleFormSubmit = this.handleFormSubmit.bind(this);
      this.selectedFileInput = React.createRef();
   }
   handleFormSubmit(event) {
      event.preventDefault();
      console.log(
         `Selected file - ${
            this.selectedFileInput.current.files[0].name
         }`
      );
   }
   render() {
      return (
         <form onSubmit={this.handleFormSubmit}>
            <label>
               Upload file:
               <input type="file" ref={this.selectedFileInput } />
            </label>
            <br />
            <button type="submit">Submit</button>
         </form>
      );
   }
}
ReactDOM.render(
   <FileInputExample />,
   document.getElementById('root')
);