【问题标题】:How to get form data from input fields in React如何从 React 中的输入字段获取表单数据
【发布时间】:2017-09-27 14:18:33
【问题描述】:

构造函数和函数:

constructor(props) {
    super(props);

    this.state = {
        tagline: 'We rank what people are talking about.',
        year: new Date().getFullYear()
    };

    this.onFormSubmit = this.onFormSubmit.bind(this);
}

onFormSubmit(e) {
    console.log('onFormSubmit', e)
    console.log('this.state', this.state);
};

表格(为清楚起见,删除了类名):

<form onSubmit={ this.onFormSubmit }>
    <div className="fl w100">
        <div>
            <input type="text" id="email" value={ this.state.email }/>
            <label htmlFor="email">Email</label>
        </div>
    </div>

    <div className="fl w100">
        <div>
            <input type="password" id="password" value={ this.state.password }/>
            <label htmlFor="password">Password</label>
        </div>
    </div>

    <button type="submit">
        Login
    </button>
</form>

这是注销的,注意没有电子邮件或密码信息:

完整的登录组件代码


import React from 'react';

class Login extends React.Component {

    constructor(props) {
        super(props);

        this.state = {
            tagline: 'We rank what people are talking about.',
            year: new Date().getFullYear()
        };

        this.onFormSubmit = this.onFormSubmit.bind(this);
    }

    onFormSubmit(e) {
        console.log('onFormSubmit', e)
        console.log('this.state', this.state);
    };

    render() {
        return (<div className="app">
            <div className="welcome">
                <header>
                    <div className="wikitags-logo">
                        <img src="imgs/wikitags-logo.png"/>
                    </div>
                    <h2>Admin Portal</h2>
                    <p>{ this.state.tagline }</p>
                </header>

                <section className="login-form">
                    <form onSubmit={ this.onFormSubmit }>
                        <div className="fl w100">
                            <div className="mdl-textfield mdl-js-textfield">
                                <input className="mdl-textfield__input" type="text" id="email" value={ this.state.email }/>
                                <label className="mdl-textfield__label" htmlFor="email">Email</label>
                            </div>
                        </div>

                        <div className="fl w100">
                            <div className="mdl-textfield mdl-js-textfield">
                                <input className="mdl-textfield__input" type="password" id="password" value={ this.state.password }/>
                                <label className="mdl-textfield__label" htmlFor="password">Password</label>
                            </div>
                        </div>

                        <button type="submit" className="mdl-button mdl-js-button mdl-button--raised mdl-js-ripple-effect mdl-button--accent">
                            Login
                        </button>
                    </form>
                </section>

                <footer>
                    &copy; { this.state.year } WikiTags
                </footer>
            </div>
        </div>);
    }
}

export default Login;

【问题讨论】:

    标签: javascript reactjs input


    【解决方案1】:

    建议:

    1. 您在输入字段中使用 value 属性,但您没有定义 onChange 方法,因此您的输入字段将是只读,因为状态值不会得到更新。

    2.您需要定义一个 onChange 事件将所有输入字段或通过删除 value 属性使它们不受控制的元素。

    3.在不受控制的元素的情况下,定义每个字段的引用并访问值使用this.ref_name.value

    通过定义 onChange 事件:

    为每个输入元素定义名称属性(名称应与状态变量名称相同,这将有助于更新状态,我们可以在单个 onChange 函数中处理所有更改),如下所示:

    <input type="text" name='value' value={this.state.value} onChange={(e) => this.handleChange(e)} />
    
    handleChange(e){
       this.setState({[e.target.name]: e.target.value})
    }
    

    通过不受控制的元素:

    <input type="text" ref={el => this.el = el} />
    

    现在在 onSubmit 函数中使用this.el.value 来访问这个输入字段的值。

    查看此答案以供参考:https://stackoverflow.com/a/43695213/5185595

    【讨论】:

    • 不错!我喜欢你的解决方案,直接使用事件对象来设置状态。也感谢您的解释:)
    【解决方案2】:

    您没有收到电子邮件或密码信息,因为您在状态 console.log('this.state', this.state); 中传递并且您尚未设置电子邮件和密码的状态。

    现在,您有两个选择:

    1. 设置状态并从那里获取表单信息
    2. 将输入值传递给处理信息的函数

    对于选项 1,您需要为您的电子邮件和密码设置一个状态(尽管不建议为密码设置一个状态)并在输入上设置一个 onChange 事件处理程序。

    设置您的 onChange 事件处理程序。

    <form onSubmit={ this.onFormSubmit }>
      <input type="text" id="email" onChange={this.handleEmailChange} value={ this.state.email } />
    
      <input type="password" id="password" onChange={this.handlePasswordChange} value={ this.state.password } />
    
      <button type="submit">
        Login
      </button>
    </form>
    

    以及设置emailpassword 状态的函数。

    handleEmailChange(event) {
      this.setState({ email: event.target.value });
    }
    
    handlePasswordChange(event) {
      this.setState({ password: event.target.value });
    }
    

    别忘了在构造函数中初始化emailpassword 的状态并绑定函数。

    constructor(props) {
      super(props);
    
      this.state = {
        email: '',
        password: ''
      };
    
      this.handleEmailChange = this.handleEmailChange.bind(this);
      this.handlePasswordChange = this.handlePasswordChange.bind(this);
    }
    

    你就完成了!然后在onFormSubmit 函数上,只需访问状态this.state.emailthis.state.password 中的emailpassword 值,然后做任何你想做的事情。

    现在对于选项 2,您只需传入输入的 event.target.value,这些是电子邮件和密码的值,然后将这些值传递给表单事件处理程序 onSubmit 函数,从那里您可以做任何你想做的事(设置状态或更新电子邮件和密码,更改它们等等)。

    <form onSubmit={ this.onFormSubmit }>
      <input type="text" id="email" name="theEmail" />
    
      <input type="password" id="password" name="thePassword" />
    
      <button type="submit">
        Login
      </button>
    </form>
    

    还有onFormSubmit 函数。

    onFormSubmit(event) {
      const email = event.target.theEmail.value;
      const password = event.target.thePassword.value;
    
      // do stuff
      console.log('Email:', email);
      console.log('Password:', password);
    };
    

    完成您正在尝试做的事情的更简单且推荐的方法是选项 2。

    请记住,您的应用处理的状态越少越好。

    【讨论】:

    • 也感谢您的回答! +1
    • 哇哦,关于 2 的解释很好。特别是对于这个登录表单。
    【解决方案3】:

    所以我的处理方法是使用所谓的受控组件将值存储在您的状态中。制作一个受控组件很简单,这是一个基本的实现:

    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});
      }
    
      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} />
            </label>
            <input type="submit" value="Submit" />
          </form>
        );
      }
    }
    

    这里的关键是handleChange 函数和onChange 属性。每次输入字段发生变化时,都会调用handleChange函数并更新状态。

    您可以在此处从文档中找到更多信息:https://facebook.github.io/react/docs/forms.html

    【讨论】:

      猜你喜欢
      • 2019-11-22
      • 1970-01-01
      • 2020-09-29
      • 2021-03-11
      • 2015-04-26
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多