在 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
若是一個表單組件沒有 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> ); } }
受控組件和非受控組件各有優勢,應該根據本身的具體需求選擇受控仍是非受控component
特徵 | 非受控 | 受控 |
---|---|---|
一次性取值(好比提交表單時) | ✅ | ✅ |
提交時驗證 | ✅ | ✅ |
實時表單驗證 | ❌ | ✅ |
有條件的禁用提交按鈕 | ❌ | ✅ |
強制輸入格式 | ❌ | ✅ |
一個數據有多個輸入 | ❌ | ✅ |
動態輸入 | ❌ | ✅ |