在React中,form表單元素和其他的DOM不一樣,因為表單元素通常會保留一個內部的state狀態。
1.受控組件
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> ); } }
對於受控組件的好處是:每一個表單都有一個單獨處理它的state,這樣比較容易方便進行用戶輸入的校驗和限制
2.textarea標簽
<textarea value={this.state.textarea} onChange={this.handleChange} />
3.select標簽
與vue類似,所有選中以及change都在select根節點標簽上
//2.select class FlavorForm extends React.Component { constructor(props) { super(props); this.state = {value: 'coconut'}; 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> 選擇你喜歡的風味: <select value={this.state.value} onChange={this.handleChange}> <option value="grapefruit">葡萄柚</option> <option value="lime">酸橙</option> <option value="coconut">椰子</option> <option value="mango">芒果</option> </select> </label> <input type="submit" value="提交" /> </form> ); } }
注意:可以將數組傳至select的value中,它支持多選:<select multiple={true} value={['B', 'C']}>
4.input文件標簽
<input type=“file”>,此標簽為只讀標簽,故分類是在非受控組件。
5.處理多個輸入
//3.處理多個輸入 class Reservation extends React.Component { constructor(props) { super(props); this.state = { isGoing: true, numberOfGuests: 2, name:"haha" }; this.handleInputChange = this.handleInputChange.bind(this); } handleInputChange(event) { const target = event.target; const value = target.type === 'checkbox' ? target.checked : target.value; const name = target.name; this.setState({ [name]: value }); } render() { return ( <form> <label> 參與: <input name="isGoing" type="checkbox" checked={this.state.isGoing} onChange={this.handleInputChange} /> </label> <label> 名字: <input name="name" type="text" value={this.state.name} onChange={this.handleInputChange} /> </label> <br /> <label> 來賓人數: <input name="numberOfGuests" type="number" value={this.state.numberOfGuests} onChange={this.handleInputChange} /> </label> </form> ); } }
