受控組件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
。而後,該輸入被從新呈現爲具備的值a
。orm
當鍵入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/