zoukankan      html  css  js  c++  java
  • React中的表单元素

    在web应用开发当中,表单还是很重要的元素。
    应用表单组件有:文本框(input、textarea)、单选按钮和复选框、Select组件。
    文本框:文本框的状态改变即文本框中的内容的改变。此时的state应该是inputValue或者是textareaValue。在状态改变时的处理函数应该是

    handleInputChange(e){
    	this.setState({
    		inputValue:e.target.value
    	});
    }
    

    单选按钮和复选框:
    1.单选按钮:它的状态state就是radioValue

    this.state = {
    	radioValue:''
    };
    //在这里只是设置了radioValue的值,因为单选按钮本来就是只有一个按钮被选中
    //当用户点击单选按钮的时候,就会通过下面的函数获取到选中的按钮的value
    //即radioValue
    handleChange(e){
        this.setState({
            radioValue:e.target.value,
        })
    }
    
    //下面通过===一次判断每个input标签的值和radioValue是否相等来判断checked的值是true还是false
    <input 
        type="radio"
        value="male"
        checked={radioValue === 'male'}
        onChange = {this.handleChange}
    />
    <input 
        type="radio"
        value="female"
        checked={radioValue === 'female'}
        onChange={this.handleChange}
    />
    

    2.复选框:它的状态是通过一个数组来保存的,因为复选,即就应该保存选中的多个复选框,以便用户进行操作,从而改变状态而重新渲染。

    this.state = {
        coffee:[],
    }
    //通过一个数组来保存状态
    handleChange(e){
        const {checked,value} = e.target;
        let {coffee} = this.state;
    
        //判断这个复选框是否被选中
        if(checked && coffee.indexOf(value) === -1){
            coffee.push(value);
        }else{
            coffee = coffee.filter(i => i !== value);
        }
    
        this.setState({
            coffee,
        });
    }
    

    然后通过coffee.indexOf('aa') 去遍历coffee这个数组,是否能找到和aa相同的字符串,来进行复选框checked是true还是false的判断。

    <p>请你选择你最喜欢的咖啡</p>
    <label>
        <input 
            type="checkbox"
            value="aa"
            checked={coffee.indexOf('aa') !== -1}
            onChange={this.handleChange}
        />
        aa
    </label>
    <br/>
    <label>
        <input 
            type="checkbox"
            value="bb"
            checked={coffee.indexOf('bb') !== -1}
            onChange={this.handleChange}
        />
    </label>
    

    Select组件:如果是单选,就用单个变量保存,如果是多选就用一个数组保存。
    1.单选:

    this.state = {
        area:'',
    }
    
    handleChange(e){
        this.setState({
            area:e.target.value,
        });
    }
    
    render(){
        const {area} = this.state;
    
        return(
            <select value={area} onChange={this.handleChange}>
                <option value="beijing">北京</option>
                <option value="shanghai">上海</option>
                <option value="hangzhou">杭州</option>
            </select>
        )
    }
    

    2.多选

    this.state = {
        area:['beijing','shanghai'],
    };
    
    handleChange(e){
        const {options} = e.target;
        //注意,这里返回的options是一个对象,并非数组
        const area = Object.keys(options).
        filter(i => options[i].selected === true)
        .map(i => options[i].value);
    
        this.setState({
            area,
        });
    }
    
    render(){
        const {area} = this.state;
        return(
            <select multiple={true} value={area} onChange={this.handleChange}>
                <option value="beijing">北京</option>
                <option value="shanghai">上海</option>
                <option value="hangzhou">杭州</option>
            </select>
        );
    }
    
  • 相关阅读:
    Codevs 2597 团伙(并查集)
    Codevs 1074 食物链 2001年NOI全国竞赛
    Bzoj 3831 [Poi2014]Little Bird
    Codevs 4600 [NOI2015]程序自动分析
    Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
    段落排版--中文字间距、字母间距
    段落排版--行间距(行高)
    段落排版--缩进
    文字排版--删除线
    文字排版--下划线
  • 原文地址:https://www.cnblogs.com/sminocence/p/8451255.html
Copyright © 2011-2022 走看看