React 進階之路(六)

豐寸發表於2019-05-20

之前的文章我們介紹了 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 表單內的值。

最後執行結果為:

 

相關文章