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 函式為表單欄位建立一個引用,在表單提交時,我們可以透過 suing this.inputUserName.current .value 訪問欄位值。請注意在 ref 名稱後使用current

它實際上是一個快速且有點糙的解決方案,程式碼較少,但控制較少。

使用非受控元件,React 提供了名為 defaultValue 的屬性,以向表單欄位提供初始值。

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')
);

更新時間: 2019 年 8 月 28 日

378 次瀏覽

開啟你的事業

完成課程獲得認證

開始
廣告
© . All rights reserved.