美文网首页React
008|React之处理表单

008|React之处理表单

作者: 中年小钢炮 | 来源:发表于2017-06-06 22:30 被阅读39次

    在HTML中,一个经典表单如下:

    <form>
      <label>
        Name:
        <input type="text" name="name" />
      </label>
      <input type="submit" value="Submit" />
    </form>
    

    在React中,表单存在于一个组件中。为了更好的控制,通知组件会将控件的赋值操作给截获,获取新值,然后再设置于控制。这样可以保证表单与组件中的数值一致。

    class NameForm extends React.Component {
      constructor(props) {
        super(props);
        this.state = {value: ''};
    
        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
      }
    
      handleChange(event) {
        this.setState({value: event.target.value}); // 截获value
      }
    
      handleSubmit(event) {
        alert('A name was submitted: ' + this.state.value);
        event.preventDefault();
      }
    
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              Name:
              <input type="text" value={this.state.value} onChange={this.handleChange} /> // 将state.value设置到控件
            </label>
            <input type="submit" value="Submit" />
          </form>
        );
      }
    }
    

    上面是input的处理,我们再来看一下select的处理。select也是处理value,以及截获onChange。

    class FlavorForm extends React.Component {
      constructor(props) {
        super(props);
        this.state = {value: 'coconut'};
    
        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
      }
    
      handleChange(event) {
        this.setState({value: event.target.value});
      }
    
      handleSubmit(event) {
        alert('Your favorite flavor is: ' + this.state.value);
        event.preventDefault();
      }
    
      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              Pick your favorite La Croix flavor:
              <select value={this.state.value} onChange={this.handleChange}> // 截获onChnage
                <option value="grapefruit">Grapefruit</option>
                <option value="lime">Lime</option>
                <option value="coconut">Coconut</option>
                <option value="mango">Mango</option>
              </select>
            </label>
            <input type="submit" value="Submit" />
          </form>
        );
      }
    }
    

    上述两种情况,处理的均是单一控件的情况。如果有多个控件,可以通过添加name属性来区别:

    class Reservation extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          isGoing: true,
          numberOfGuests: 2
        };
    
        this.handleInputChange = this.handleInputChange.bind(this);
      }
    
      handleInputChange(event) {
        const target = event.target;
        const value = target.type === 'checkbox' ? target.checked : target.value;
        const name = target.name; // 获取名字
    
        this.setState({
          [name]: value // 此处是关键,将value的key设置为target.name
        });
      }
    
      render() {
        return (
          <form>
            <label>
              Is going:
              <input
                name="isGoing"
                type="checkbox"
                checked={this.state.isGoing} // 直接使用name作为key
                onChange={this.handleInputChange} />
            </label>
            <br />
            <label>
              Number of guests:
              <input
                name="numberOfGuests"
                type="number"
                value={this.state.numberOfGuests} // 直接使用name作为key
                onChange={this.handleInputChange} />
            </label>
          </form>
        );
      }
    }
    

    React中什么是Uncontrolled Component?

    好,这一节就到这里。后续我将介绍更多React技术细节,来慢慢解答上述问题。

    想学计算机技术吗?需要1对1专业级导师指导吗?想要团队陪你一起进步吗?欢迎加我为好友!微信号:iTekka。

    相关文章

      网友评论

        本文标题:008|React之处理表单

        本文链接:https://www.haomeiwen.com/subject/ydpnfxtx.html