react表單---受控組件與非受控組件

1、受控組件

在 React 中,表單元素經過組件的 state 屬性來本身維護 state,並根據用戶輸入調用setState()來進行數據更新,使 React 的 state 成爲「惟一數據源」,被 React 以這種方式控制取值的表單輸入元素就叫作「受控組件」。html

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 (
      <form onSubmit={this.handleSubmit}>
        <label>
          名字:
          <input type="text" value={this.state.value} onChange={this.handleChange} />
        </label>
        <input type="submit" value="提交" />
      </form>
    );
  }
}

在 React 中,數據是單向流動的。從示例中,咱們能看出來表單的數據源於組件的 state,並 經過 props 傳入,這也稱爲單向數據綁定。而後,咱們又經過 onChange 事件處理器將新的表單數 據寫回到組件的 state,完成了雙向數據綁定。這也意味着咱們能夠在執行最後 一步 setState 前,對錶單值進行清洗和校驗。react

React 受控組件更新 state 的流程:
(1)能夠經過在初始 state 中設置表單的默認值。
(2)每當表單的值發生變化時,調用 onChange 事件處理器。
(3)事件處理器經過合成事件對象 e 拿到改變後的狀態,並更新應用的 state。
(4)setState 觸發視圖的從新渲染,完成表單組件值的更新。this

2、非受控組件

若是一個表單組件沒有 value props(單選按鈕和複選框對應的是 checked prop) 時,就能夠稱爲非受控組件。相應地,你能夠使用 defaultValue 和 defaultChecked prop 來表示 組件的默認狀態code

元素 value屬性 change回調 回調獲取新值
<input type="text" /> value="string" onChange event.target.value
<input type="checkbox" /> checked={boolean} onChange event.target.checked
<input type="radio" /> checked={boolean} onChange event.target.checked
<textarea /> value="string" onChange event.target.value
<select /> value="option value" onChange event.target.value
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 (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" defaultValue="Bob" ref={this.input} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}

2、受控組件與非受控組件對比

受控組件和非受控組件各有優勢,應該根據本身的具體需求選擇受控仍是非受控component

特徵 非受控 受控
一次性取值(好比提交表單時)
提交時驗證
實時表單驗證
有條件的禁用提交按鈕
強制輸入格式
一個數據有多個輸入
動態輸入
相關文章
相關標籤/搜索