在react中,組件內部主要是通過props和state來存儲組件的屬性與狀態的。其中props是通過父組件傳入,在組件內部不能進行修改。而state是保存可變狀態的一個對象,通過this.setState方法進行修改,注意不能直接使用this.state.xx = ?來進行修改,這樣是沒有效果的。每一次setState后都會重新渲染組件。介紹完state后,我們開始介紹受控組件和非受控組件。
受控組件
受控組件,顧名思義是受到控制的組件,那么是通過什么來受到控制呢?
<input value={this.state.inputValue} />
當input的value值為state.inputValue時,當用戶對input進行操作時,沒有對inputValue進行setState()操作,這個值不變,也就意味着input顯示不變。但是如果我們給input一個事件,在事件中進行對state的修改,那么值會如何呢?
inputChange = e => this.setState({value: e.target.value}) render() { return ( <input value="this.state.value" onChange={this.inputChange}/> ) }
在這里,每當用戶輸入時,input觸發onChange事件,調用inputChange函數修改了value值。使用受控組件,每個狀態的改變都有一個與之相關的處理函數。好處是可以直接修改或驗證用戶輸入。
非受控組件
非受控組件不同於受控組件數據是react組件處理的,是通過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> ); } }
如官方文檔中例子,此時將input通過ref暴露給組件,可以通過this.input進行訪問。