受控組件和不受控組件的區別

受控組件react

在HTML中,標籤<input>、<textarea>、<select>的值的改變一般是根據用戶輸入進行更新。在React中,可變狀態一般保存在組件的狀態屬性中,而且只能使用 setState() 更新,而呈現表單的React組件也控制着在後續用戶輸入時該表單中發生的狀況,以這種由React控制的輸入表單元素而改變其值的方式,稱爲:「受控組件」。this

class NameForm extends React.Component {
    constructor(props) {
        super(props);
        this.state = {name: ''};
        this.handleNameChange = this.handleNameChange.bind(this);
    }

    handleNameChange(event) {
        this.setState({ name: event.target.value });
    };

    render() {
        return (
            <div>
                <input type="text" value={this.state.name} onChange={this.handleNameChange}/>
            </div>
        );
    }
}

原理圖:spa

 

  • name開始是空字符串''code

  • 當鍵入a,handleNameChange獲取a和調用setState。而後,該輸入被從新呈現爲具備的值aorm

  • 當鍵入b,handleNameChange獲取ab並設置該狀態的值。如今再次從新渲染輸入value="ab"。
    blog

這也意味着表單組件能夠當即響應輸入更改; 例如:字符串

  • 就地反饋,如驗證
  • 禁用按鈕,除非全部字段都有有效的數據
  • 執行特定的輸入格式,如信用卡號碼

"受控"執行狀況get

元素 屬性 方法 方法回調中的新值
<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

 

 

 

 

 

 

可見效果:當註釋 this.setState({value: event.target.value}); 這行代碼,文本框再次輸入時,頁面不會從新渲染,所產生效果便是文本框輸入不了值,即文本框值的改變受到 setState() 方法的控制,在未執行時,不從新渲染組件input

 

不受控組件string

表單數據由DOM自己處理。即不受setState()的控制,與傳統的HTML表單輸入類似,input輸入值即顯示最新值(使用 ref 從DOM獲取表單值

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.input.value);
    event.preventDefault();
  }

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

 

結論

受控和不受控元素都有其優勢,根據具體狀況選擇。若是表單在UI反饋方面很是簡單,則對ref進行控制是徹底正確的,即便用不受控組件。

特徵 不受控制 受控
一次性檢索(例如表單提交) yes yes
及時驗證 no yes
有條件的禁用提交按鈕 no yes
執行輸入格式 no yes
一個數據的幾個輸入 no yes
動態輸入 no yes

 

 

 

 

 

 

 

參考文章地址:

https://goshakkk.name/controlled-vs-uncontrolled-inputs-react/

相關文章
相關標籤/搜索