react中使用Input表单双向绑定方法

input react 表单
input 密码框在谷歌浏览器下 会有黄色填充 官网的不太用,这个比较好用

type="password" autoComplete="new-password"
HTML
index.jsx
import React, { Component } from 'react';
import { NavLink} from 'react-router-dom';

// import Checkbox from './checkbox.jsx';
// import AllCheck from './allcheck.jsx';
// import All from './all.jsx';
import All1 from './all1.jsx';

class View extends Component{
    constructor(props){
        super(props);
        this.state = {
            name:'',
            year:'',
            comp:'',
            exp:{
                year:'',
                comp:'',
                job:'',
            },
            resume:{
                base:{
                    name:'',
                    age:'',
                    genders:'male'
                },
                exp:{
                    year:'',
                    comp:'',
                    job:'',
                    detail:'',
                    area:'lime'
                }
            }
        }
    }
    // 单个input
    handleChange(e){
        // 获取 input 元素上的value
        let value = e.target.value;
        this.setState({
            name:value
        })
    }
    // 多个input
    _handleChange(e){
        // 获取 input 元素上的value
        let name = e.target.name;
        let value = e.target.value;
        this.setState({
            [name]:value
        })
    }
    // 多个input exp
    __handleChange(e){
        // 获取 input 元素上的value
        let name = e.target.name;
        let value = e.target.value;
        const exp = this.state.exp;
        // year exp.year = value
        // comp exp.comp = value
        // job exp.job = value
        exp[name] = value;
        this.setState({exp})
    }
    // 多个input exp
    ___handleChange(e){
        // 获取 input 元素上的value
        let name = e.target.name;
        let value = e.target.value;
        const resume = this.state.resume;
        const namekey = e.target.getAttribute('namekey');
        // resume.base.name = name;
        // resume.base.age = age;
        // resume.exp.job = job;
        resume[namekey][name] = value;

        this.setState({resume})
        /**
            第一步
                设置state 默认值
            第二步
                写jsx 中 input
                    value
                    onChange
                如果多input 或深层次
                    增加name属性
                如果多个input 较深层次
                    除了 增加默认的name 还需自定义一个namekey
            第三步
                在onChange 方法中定义setState

            SP
                对象的[]用法与场景
            作业
            1、实现checkbox
            2、正选 反选
        **/
    }
    render(){

        return (
            <div className="input_con">
                <NavLink to="/">首页</NavLink><br/>
                <NavLink to="/input">表单</NavLink><br/>
                <NavLink to="/event">事件</NavLink><br/>
                <NavLink to="/tab">tab</NavLink>
                <h2>input 表单课</h2>
                <ul>
                    <li>用户名:{this.state.name}</li>
                    <li>
                        <label>用户名</label>
                        <div className="lable_ctrl">
                            <input type="text" value={this.state.name}
                            placeholder="请输入用户名" onChange={(e)=>this.handleChange(e)}/>
                        </div>
                    </li>
                </ul>
                <ul>
                    <li>工作年限:{this.state.year}</li>
                    <li>
                        <label>工作年限</label>
                        <div className="lable_ctrl">
                            <input type="text" name="year" value={this.state.year}
                            placeholder="请输入工作年限" onChange={(e)=>this._handleChange(e)}/>
                        </div>
                    </li>
                    <li>公司名称:{this.state.comp}</li>
                    <li>
                        <label>公司名称</label>
                        <div className="lable_ctrl">
                            <input type="text" name="comp" value={this.state.comp}
                            placeholder="请输入公司名称" onChange={(e)=>this._handleChange(e)}/>
                        </div>
                    </li>
                </ul>
                <ul>
                    <li>工作年限:{this.state.exp.year}</li>
                    <li>
                        <label>工作年限</label>
                        <div className="lable_ctrl">
                            <input type="text" name="year" value={this.state.exp.year}
                            placeholder="请输入工作年限" onChange={(e)=>this.__handleChange(e)}/>
                        </div>
                    </li>
                    <li>工作年限:{this.state.exp.comp}</li>
                    <li>
                        <label>公司名称</label>
                        <div className="lable_ctrl">
                            <input type="text" name="comp" value={this.state.exp.comp}
                            placeholder="请输入公司名称" onChange={(e)=>this.__handleChange(e)}/>
                        </div>
                    </li>
                    <li>工作职责:{this.state.exp.job}</li>
                    <li>
                        <label>工作职责</label>
                        <div className="lable_ctrl">
                            <input type="text" name="job" value={this.state.exp.job}
                            placeholder="请输入工作职责" onChange={(e)=>this.__handleChange(e)}/>
                        </div>
                    </li>
                </ul>
                <h2>resume</h2>
                <ul>
                    <li>姓名:{this.state.resume.base.name}</li>
                    <li>
                        <label>姓名</label>
                        <div className="lable_ctrl">
                            <input type="text" name="name" namekey="base" value={this.state.resume.base.name}
                            placeholder="请输入姓名" onChange={(e)=>this.___handleChange(e)}/>
                        </div>
                    </li>
                    <li>年龄:{this.state.resume.base.age}</li>
                    <li>
                        <label>年龄</label>
                        <div className="lable_ctrl">
                            <input type="text" name="age" namekey="base" value={this.state.resume.base.age}
                            placeholder="请输入年龄" onChange={(e)=>this.___handleChange(e)}/>
                        </div>
                    </li>
                    <li>工作职责:{this.state.resume.exp.job}</li>
                    <li>
                        <label>工作职责</label>
                        <div className="lable_ctrl">
                            <input type="text" name="job" namekey="exp" value={this.state.resume.exp.job}
                            placeholder="请输入工作职责" onChange={(e)=>this.___handleChange(e)}/>
                        </div>
                    </li>
                    <li>工作详情:{this.state.resume.exp.detail}</li>
                    <li>
                        <label>工作详情</label>
                        <div className="lable_ctrl">
                            <textarea name="detail" namekey="exp" value={this.state.resume.exp.detail} onChange={(e)=>this.___handleChange(e)}></textarea>
                        </div>
                    </li>
                    <li>手机号的区号:{this.state.resume.exp.area}</li>
                    <li>
                        <label>手机号的区号</label>
                        <div className="lable_ctrl">
                            <select name="area" namekey="exp" defaultValue={this.state.resume.exp.area} onChange={(e)=>this.___handleChange(e)}>
                                <option value="grapefruit">葡萄柚</option>
                                <option value="lime">酸橙</option>
                                <option value="coconut">椰子</option>
                                <option value="mango">芒果</option>
                            </select>
                        </div>
                    </li>
                    <li>性别:{this.state.resume.base.genders}</li>
                    <li>
                        <label>性别</label>
                        <div className="lable_ctrl">
                            <label>男<input type="radio" name="genders" namekey="base" value="male" onClick={(e)=>this.___handleChange(e)} defaultChecked={this.state.resume.base.genders==='male'}/></label>
                            <label htmlFor="gender">女</label><input name="genders" namekey="base" value="female" id="gender" type="radio" defaultChecked={this.state.resume.base.genders==='female'} onClick={(e)=>this.___handleChange(e)}/>
                        </div>
                    </li>
                </ul>
                <All1/>
            </div>
        )
    }
}
export default View;

React JSX
all1.jsx
import React , { Component } from 'react';
class View extends Component {
    constructor(props){
        super(props);
        this.state =  {
            isGoing:false,
            checkNode:[
                {checked:false,name:"Vue"},
                {checked:false,name:"React"},
                {checked:false,name:"Angular"},
                {checked:false,name:"Ember"},
                {checked:false,name:"Omi"},
            ]
        }
    }
    handleInputChange(e){
        let checked = e.target.checked;
        let name = e.target.name;
        if(checked){
            this.state.checkNode.forEach(v=>{
                v.checked = true;
            })
        }else {
            const obj = this.state.checkNode;
            for(let index in obj){
                obj[index].checked = false;
            }
        }
        this.setState({
            [name]:checked
        })
    }
    handleChange(e,key){
        const checkNode = this.state.checkNode;
        checkNode[key].checked = !checkNode[key].checked
        // this.state.checkNode[0].checked
        let bTrue = true;
        for(let i=0,len=checkNode.length;i<len;i++){
            if(!checkNode[i].checked){
                bTrue = false;
                break;
            }
        }
        this.setState({
            isGoing:bTrue,
            checkNode
        })
    }
    render(){
        // console.log(this.state.isGoing)
        const checkList = this.state.checkNode.map((val,key)=>(
            <p key={key}>
                <input type="checkbox"
                    checked={val.checked}
                    onChange={(e)=>this.handleChange(e,key)}
                />
                <label>{val.name}</label>
            </p>
        ))
        return(
            <div>
                <h2>今天要讲checkbox 的demo</h2>
                <input
                name="isGoing"
                type="checkbox"
                checked={this.state.isGoing}
                onChange={(e)=>this.handleInputChange(e)} />
                {checkList}
            </div>
        )
    }
}
export default View;

  本章CSDN地址:https://blog.csdn.net/lastone1212/article/details/117364940

posted @ 2021-07-07 11:49  小李的博世界  阅读(1127)  评论(0编辑  收藏  举报