赞助

将state与表单项中的value值绑定在一起,有state的值来控制表单元素的值,称为受控组件。

绑定步骤:

  • 在state中添加一个状态,作为表单元素的value值
  • 给表单元素绑定change事件,将表单元素的值设置为state的值

<input type="text" value={this.state.username} onChange={this.inputChange.bind(this)} />

 

注:多表单元素需优化事件方法

this.setState({

    [e.target.name]: e.target.value

})

import React, { Component } from 'react'

export default class User2 extends Component {

  state = {
    userinfo: {
      username: 'admin',
      password: '',
      isSave: true,
      sex: '女'
    }
  }

  render() {
    let { username, password, isSave, sex } = this.state.userinfo
    return (
      <div>
        <div>
          {/* 受控组件 */}
          {/* 表单选项中的值都是string */}
          <input type="text" name="username" value={username} onKeyUp={this.addUser.bind(this)} onChange={this.setInput.bind(this)} />
        </div>
        <div>
          {/* 受控组件 */}
          {/* 表单选项中的值都是string */}
          <input type="text" name="password" value={password} onKeyUp={this.addUser.bind(this)} onChange={this.setInput.bind(this)} />
        </div>

        <div>
          {/* 不需要value中的数据 同时它还需要true/false布尔类型 */}
          <input type="checkbox" name="isSave" checked={isSave} onChange={this.setInput.bind(this)} />是否保存数据
        </div>

        <div>
          <input type="radio" name="sex" checked={sex === '男' ? true : false} value="男" onChange={this.setInput.bind(this)} />男
          <input type="radio" name="sex" checked={sex === '女' ? true : false} value="女" onChange={this.setInput.bind(this)} />女
        </div>


      </div>
    )
  }

  // 把input中的数据同步到state数据源中
  setInput(evt) {
    // 表单项名称 变量 => 变量的值才是对象中的key
    let name = evt.target.name

    // 获取表单项中的数据
    let value = evt.target.value

    // 复选框  它需要boolean类型
    if ('checkbox' === evt.target.type) {
      value = !this.state.userinfo[name]
    }

    // 同步到state数据源中
    this.setState(state => state.userinfo[name] = value)
  }

  addUser(evt) {
    if (evt.keyCode === 13) {
      console.log('提交了数据', this.state.userinfo);
      this.setState(state => state.userinfo.username = '')
    }
    // console.log(this.state.userinfo);
  }


}

 

posted on 2021-04-16 17:08  Tsunami黄嵩粟  阅读(62)  评论(0编辑  收藏  举报