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 表单内的值。

最后运行结果为:

 

posted @ 2019-05-20 09:49  丰寸  阅读(378)  评论(1编辑  收藏  举报