React 進階之路(六)
之前的文章我們介紹了 React 表單事件 鍵盤事件 事件物件以及 React中 的 ref 獲取 dom 節點 、雙向資料繫結。接下來我們將介紹 React 表單詳解 約束性和非約束性元件 input text checkbox radio select textarea 以及獲取表單的內容。
1 import React, {Component} from 'react'; 2 3 class Home extends Component { 4 constructor(props) { 5 super(props); 6 this.state = { 7 name: "", 8 sex: "1", 9 city: "", 10 cities: ["北京", "上海", "南京"], 11 hobbies: [{ 12 title: "抽菸", checked: true 13 }, { 14 title: "喝酒", checked: false 15 }, { 16 title: "燙頭", checked: false 17 }], 18 info: "", 19 } 20 21 } 22 23 // 獲取所有資料 24 getAllData = (event) => { 25 event.preventDefault(); 26 console.log(this.state) 27 } 28 29 // 名字 30 changeName = (event) => { 31 this.setState({ 32 name: event.target.value 33 }) 34 } 35 36 // 性別 37 changeSex = (event) => { 38 this.setState({ 39 sex: event.target.value 40 }) 41 } 42 43 // 地址 44 changeCity = (event) => { 45 this.setState({ 46 city: event.target.value 47 }) 48 } 49 50 // 愛好 51 changeHobbies = (key) => { 52 let hobbies = this.state.hobbies; 53 hobbies[key].checked = !hobbies[key].checked; 54 this.setState({ 55 hobbies: hobbies 56 }) 57 } 58 59 // 簡介 60 changeInfo = (event) => { 61 this.setState({ 62 info: event.target.value 63 }) 64 } 65 66 render() { 67 return ( 68 <div> 69 <p>Hello {this.state.name}</p> 70 <form action="" onSubmit={this.getAllData}> 71 72 使用者名稱: 73 <input value={this.state.name} onChange={this.changeName} type="text"/> 74 75 <br/><br/> 76 77 性別: 78 男<input value="1" checked={this.state.sex === "1"} onChange={this.changeSex} type="radio"/> 79 女<input value="2" checked={this.state.sex === "2"} onChange={this.changeSex} type="radio"/> 80 81 <br/><br/> 82 83 地址: 84 <select value={this.state.city} onChange={this.changeCity}> 85 {this.state.cities.map((val, key) => { 86 return <option key={key}>{val}</option> 87 })} 88 </select> 89 90 <br/><br/> 91 92 愛好: 93 {this.state.hobbies.map((val, key) => { 94 return ( 95 <span key={key}> 96 {val.title} 97 <input checked={val.checked} onChange={this.changeHobbies.bind(this, key)} type="checkbox"/> 98 </span> 99 ) 100 })} 101 102 <br/><br/> 103 104 簡介: 105 <textarea value={this.info} onChange={this.changeInfo}></textarea> 106 <br/><br/> 107 108 <input value="提交" type="submit"/> 109 </form> 110 111 </div> 112 ); 113 } 114 } 115 116 export default Home;
之前我們已經介紹過了表單在 React 的一些基本資訊,上面的程式碼比較詳細的介紹了一下不同表單獲取資訊的方式。
下面是不同表單的不同處理方式:
1、text:
用 value 繫結 this.state 中的資料,然後通過 onChange 事件獲取 changeName 方法,在 event 事件中獲取 input 的值並賦值給 this.state
2、radio:
性別只能選擇一個,所以 this.state.sex 預設值為 1 ,表示男,value 值分別繫結為 1 和 2,通過 checked 屬性來判斷哪個被選中,通過 onChange 事件將預設的 value 值賦值給 this.state.sex,checked 屬性就能來判斷被選中的值了。
3、select:
select 跟正常的 HTML 有所不同,它的 value 值繫結在 select 上,然後通過 onChange 事件獲取選中的值,並將該值賦值給另一個變數來儲存所選的值。
4、checkbox:
checkbox 為一個數組,可以選擇多個值,在 this.state 的每個值中再新增一個屬性 checked,選中為 true,沒選中為 false,當點選某一個時,將所選中的值通過 onChange 事件傳給 changeHobbies,然後通過該值找到 this.state 列表中的位置,將 checked 屬性值去反即可來控制選中和取消選中。
5、textarea:
textarea 和 text 的獲取值方法是一樣的,通過 value 繫結 this.state 中的值,通過 onChange 事件來獲取 textarea 框內的值並賦給 this.state。
這樣就實現了 form 表單中的值的雙向資料繫結,可以通過在 form 上新增 onSubmit 事件,取消預設觸發事件來獲取 form 表單內的值。
最後執行結果為: