react 表单

根据react的示例,要取得受限组建的值,可以采用下面的方法:

import React ,{PropTypes}from 'react';
import { render } from 'react-dom';
const styles={
    mb10:{
        marginBottom:'15px'
    },
    w200:{
        width:'200px',
    }
}

class test extends React.Component{
    constructor(props){
        super();//和react没什么关系,javascript的特性,用于访问父对象上的函数。
        this.state={
            uName:'',
            choose:'1',//==>设置默认值
            gender:'Male',//==>设置默认值
            city:{
                cd:false,
                bj:true,
                sh:true
            },
            desc:'',
        }
    };
    nameChange = (event)=> {
        this.setState({
            uName:event.target.value
        });
    };
    chooseChange = (event) =>{
        this.setState({
            choose:event.target.value
        });
        console.log(event.target.value)//==>立即打印值
    };
    handleGenderChange = (e) => {
          this.setState({
            gender: e.target.value
      });
    };
    cityChang = (event) => {
        const value = event.target.value;
        const city = Object.assign({}, this.state.city);

        city[value] = !city[value];

        this.setState({
            city: city
        });
    };
    descChange = (e) => {
        this.setState({
            desc:e.target.value
        })
    };
    formSubmit = () => {
        console.log(this.state)//打印全部
        console.log('uName是:'+this.state.uName)
        console.log("select值是:"+this.state.choose)
        console.log("radio值是:"+this.state.gender)
        console.log("选择的城市是:"+ Object.keys(this.state.city).filter(item => this.state.city[item]).join(','))
        console.log("文本域内容是:"+this.state.desc)
    };
    render(){
        const selectList=[
            {value:'1',lable:'选择1'},
            {value:'2',lable:'选择2'},
            {value:'3',lable:'选择3'},
            {value:'4',lable:'选择4'},
            {value:'5',lable:'选择5'},
            {value:'6',lable:'选择6'}
        ]
        return(
            <div>
                <div>
                    <div style={styles.mb10}>
                        姓名:
                        <input type="text" name="uName" value={this.state.uName} onChange={this.nameChange}/>
                        <span>{this.state.nameError}</span>
                    </div>
                    <div style={styles.mb10}>
                        下拉框:
                        <select style={styles.w200} name="choose" value={this.state.choose} onChange={this.chooseChange}>
                        {selectList.map((list,index)=>(
                            <option value={list.value} key={index}>{list.lable}</option>
                        ))}
                        </select>
                    </div>
                    <div style={styles.mb10}>
                        单选框:
                        <input type="radio" name="gender" value="Male" onChange={ this.handleGenderChange } checked={ this.state.gender === 'Male' } />
<input type="radio" name="gender" value="Female" onChange={ this.handleGenderChange } checked={ this.state.gender === 'Female' } />
</div>
                    <div style={styles.mb10}>
                        复选框:
                        <input name="city" type="checkbox" value="cd" onChange={this.cityChang} checked={this.state.city.cd}/>成都
                        <input name="city" type="checkbox" value="bj" onChange={this.cityChang} checked={this.state.city.bj}/>北京
                        <input name="city" type="checkbox" value="sh" onChange={this.cityChang} checked={this.state.city.sh}/>上海
                        
                    </div>
                    <div style={styles.mb10}>
                        文本域:
                        <textarea name="desc" value={this.state.desc} onChange={this.descChange}>
                        </textarea>
                    </div>
                    <input type="button" value="提交表单" onClick={this.formSubmit} />
                </div>
            </div>
        )
    }
}
export default test;

测试打印值如下:

上面这种方法,是可以实现需求,但是当表单字段很多的时候,就比较尴尬了。不过有方法可以简写代码。

把onChange事件修改成一个,如下:

handleChange = (e) => {
        this.setState({
            [e.target.name]:e.target.value
        })
        console.log(e.target.value)//==>调试打印值
    };

dom部分也就要把onChange绑定的事件都改成这个,如下:(注意name和value的命名,与this.state中的保持一致)

<div style={styles.mb10}>
    姓名:
    <input type="text" name="uName" value={this.state.uName} onChange={this.handleChange}/>
    <span>{this.state.nameError}</span>
</div>
<div style={styles.mb10}>
    下拉框:
    <select style={styles.w200} name="choose" value={this.state.choose} onChange={this.handleChange}>
    {selectList.map((list,index)=>(
        <option value={list.value} key={index}>{list.lable}</option>
    ))}
    </select>
</div>
<div style={styles.mb10}>
    单选框:
    <input type="radio" name="gender" value="Male" onChange={ this.handleChange } checked={ this.state.gender === 'Male' } />
<input type="radio" name="gender" value="Female" onChange={ this.handleChange } checked={ this.state.gender === 'Female' } />
</div>
<div style={styles.mb10}>
    文本域:
    <textarea name="desc" value={this.state.desc} onChange={this.handleChange}>
    </textarea>
</div>

这种方法已经相对减少代码量了,但是CheckBox不能使用这种方法,CheckBox要单独写一个onChange事件,示例如第一段代码中的this.cityChang事件。

也可以使用react-compontent的form  可以大大简化代码。

https://github.com/react-component/form

关于箭头函数

以上示例使用箭头函数。

若函数是下面这种写法:

handleChange(e) {
        this.setState({
            [e.target.name]:e.target.value
        })
        console.log(e.target.value)//==>调试打印值
    };

那么就要修改下constructor,加上bind,否则有this指向问题,会出现:'setState' of undefined错误

constructor(props){
        super();//和react没什么关系,javascript的特性,用于访问父对象上的函数。
        this.state={
            uName:'',
            choose:'1',//==>设置默认值
            gender:'Male',//==>设置默认值
            city:{
                cd:false,
                bj:true,
                sh:true
            },
            desc:'',
        };
        this.handleChange=this.handleChange.bind(this);
    };

更推荐这种写法,效率高于箭头函数。

 

posted @ 2016-12-01 14:23  帅气的皮卡丘  阅读(1003)  评论(0编辑  收藏  举报