React表单详解

  1. 不可控组件和可控组件介绍
    不可控组件
    如下:
<input type="text" defaultValue="Hello World"/>

input元素中有个默认值 为HelloWorld这个字符串 我们知道React组件是将数据绑定到状态中 如上给input元素直接绑定了默认值 这样有可能使元素的值和组件中状态绑定的值不统一 当我们要获取input的输入值时就得给input 加一个ref值 然后 var inputValue=React.findDomNode(this.refs.input).value 这样获得input的输入值 很麻烦
实例:

<script type="text/jsx">
    var MyForm = React.createClass({
        handleSubmit:function (event) {
        {//阻止浏览器的默认事件}
            event.preventDefault();
            var helloTo = ReactDOM.findDOMNode(this.refs.helloTo).value;
            alert(helloTo);
        },
        render:function () {
            return <form onSubmit={this.handleSubmit}>
                <input type="text" ref="helloTo" defaultValue="Hello World"/>
                <button type="submit"> Click</button>
            </form>
        }
    });
    ReactDOM.render(<MyForm/>,document.body);
可控组件
如下:
<input type="text" defaultValue={this.state.value}

这样写 要获取input的输入值就
var inputValue = this.state.value
实例:

var MyForm = React.createClass({
      getInitialState:function () {
          return {
              helloTo:'Hello World'
          }
      },
      handleChange:function (event) {
          console.log(this.state.helloTo);
          this.setState({
              helloTo:event.target.value,
          })
      },
      handleSubmit:function (event) {
          event.preventDefault();
          alert(this.state.helloTo)
      },
     render:function () {
          return <form onSubmit={this.handleSubmit}>
              <input type="text" defaultValue={this.state.helloTo} onChange={this.handleChange}/>
              <button type="submit">Click</button>
          </form>
     }
  });
    ReactDOM.render(<MyForm/>,document.body);

组件可控的好处

  • 符合React数据流
  • 数据存储在State中,便于使用
  • 便于对数据进行处理

不同表单元素的使用
首先看有那些常见的表单元素
1、<label htmlFor="name">Name</label>

<select value={this.state.helloTo} onChange={this.handleChange}>
                  <option value="one">一</option>
                  <option value="two">二</option>
              </select>

select的值就是被选中的option的值,当option被选中时 会多一个selected属性
表单元素实例

var MyForm = React.createClass({
    getInitialState:function () {
        return{
            username:'',
            sex:'1',
            checked:true,
        }
    },
    handleSubmit:function (event) {
      event.preventDefault();
      console.log(this.state);
    },
    handleNameChange:function (event) {
        this.setState({
            username:event.target.value,
        })
    },
    handleSexChange:function (event) {
      this.setState({
          sex:event.target.value,
      })
    },
    handleCheckedChange:function (event) {
        this.setState({
            checked:event.target.checked
        })
    },
    render:function () {
        return <form onSubmit={this.handleSubmit}>
            <input id="usrname" type="text" value={this.state.username} onChange={this.handleNameChange} placeholder="请输入用户名"/>
            <select value={this.state.sex} onChange={this.handleSexChange}>
                <option value="0">女</option>
                <option value="1">男</option>
            </select>
            <label htmlFor="input">同意用户协议</label>
            <input type="checkbox" id="input" checked={this.state.checked} onChange={this.handleCheckedChange}/>
            <button type="submit">注册</button>
        </form>
    }
});

事件处理函数的复用
复用的两种方式:
一:bind复用
写函数时要有两个参数 第一个通常是name 第二个 Event
handleChange:function(name,event){

}
调用时有两个参数 一个是this另一个是字符串 指明是谁调用
{this.handleChange.bind(this,‘input’)}
实例:

//事件处理函数的复用----bind复用
  var MyForm = React.createClass({
      getInitialState:function () {
          return {
              username:'',
              gender:'1',
              checked:true,
          }
      },
      handleChange:function (name,event) {
          //构造新对象的原因是如果直接写入name 会被解析成字符串name而不是变量name
          var newState ={}
          newState[name] = name == 'checked' ? event.target.checked :event.target.value;
          this.setState(newState);
      },
      handleSubmit:function (event) {
        event.preventDefault();
        console.log(this.state);
      },

     render:function () {
            return <form onSubmit={this.handleSubmit}>
                <input type="text" onChange={this.handleChange.bind(this,'username')} placeholder="请输入用户名:" value={this.state.username}/>
                <select value={this.state.gender} onChange={this.handleChange.bind(this,'gender')}>
                    <option value="0">女</option>
                    <option value="1">男</option>
                </select>
                <input type="checkbox" id="checkBox" onChange={this.handleChange.bind(this,'checked')} checked={this.state.checked}/>
                <label htmlFor="checkBox">同意用户协议</label>
                <button type="submit">注册</button>
            </form>
     } 
  });

二:name 复用
给元素添加name
构造函数:
handleChange:function(event){
var name = event.target.name

}
调用函数
{this.handleChange}
实例:

 //事件处理函数的复用----name复用
  var MyForm = React.createClass({
      getInitialState:function () {
          return {
              username:'',
              gender:'1',
              checked:true,
          }
      },
      handleChange:function (event) {
          //构造新对象的原因是如果直接写入name 会被解析成字符串name而不是变量name
          var newState ={}
          newState[event.target.name] = event.target.name == 'checked' ? event.target.checked :event.target.value;
          this.setState(newState);
      },
      handleSubmit:function (event) {
          event.preventDefault();
          console.log(this.state);
      },

      render:function () {
          return <form onSubmit={this.handleSubmit}>
              <input type="text" onChange={this.handleChange} placeholder="请输入用户名:" value={this.state.username}  name="username"/>
              <select  value={this.state.gender} onChange={this.handleChange}  name="gender">
                  <option value="0">女</option>
                  <option value="1">男</option>
              </select>
              <input type="checkbox" id="checkBox" onChange={this.handleChange} checked={this.state.checked}  name="checked"/>
              <label htmlFor="checkBox">同意用户协议</label>
              <button type="submit">注册</button>
          </form>
      }
  });

表单组件自定义

猜你喜欢

转载自blog.csdn.net/qq_43264596/article/details/84779552