【问题标题】:React use one event handler for different inputsReact 使用一个事件处理程序处理不同的输入
【发布时间】:2016-12-06 23:02:26
【问题描述】:

在 React 应用程序中处理简单联系表单的 onChange 时如何与 DRY 编码保持一致?

我想传递一个带有应该更新状态的参数

例如,简单地有 4 个输入 [姓名、电话、电子邮件、文本] 需要 4 个不同的事件处理程序来更新组件的不同状态,这不是很好。

  constructor(props) {
    super(props);
    this.state = {
      type: '',
      message: '',
      name: '',
      email: '',
      phone: '',
      content: ''
    };
  }
  handleChange(e, state) {
    this.setState({state: e.target.value});
    alert(state + " with val " + e.target.value)
  }

这不起作用并引发无法读取未定义错误的属性“值”

<input value={this.state.name} onChange={this.handleChange(name).bind(this)} id="firstName" name="firstName" autocomplete="off" type="text" required />

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    您需要像这样将参数传递给handleChange

    onChange={ this.handleChange.bind(this, name) }
    

    handleChange 的签名将是 handleChange(state, e) {}


    或者你可以使用arrow function

    onChange={ (e) => this.handleChange(e, name) }
    

    更新

    根据您的问题描述,我想您不需要传递额外的参数,您可以输入name在这种情况下,我认为输入名称和状态名称可以相同) ,并且可以这样做

    class Form extends React.Component {
      constructor(props) {
        super(props);
        
        this.state = {
          // type: '',
          // message: '',
          name: '',
          email: '',
          // phone: '',
          // content: ''
        };
        this.handleChange = this.handleChange.bind(this);
      }
      
      handleChange(e) {
        this.setState({ [e.target.name]: e.target.value })
      }
      
      render() {
        return <div>
          <input 
            value={this.state.name} 
            onChange={ this.handleChange } 
            name="name" 
            autocomplete="off" 
            type="text" 
            required 
          />
              
          <input 
            value={this.state.email} 
            onChange={ this.handleChange } 
            name="email" 
            autocomplete="off" 
            type="text" 
            required 
          />
              
          <p>{this.state.name},{this.state.email}</p>
        </div>
      }
    };
    
    ReactDOM.render(<Form />, document.getElementById('root'))
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
    <div id="root"></div>

    【讨论】:

    • @AlexanderT。更新看起来是最好和最简单的解决方案。感谢您的帮助和多种选择!
    猜你喜欢
    • 2018-01-25
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2020-04-20
    • 1970-01-01
    相关资源
    最近更新 更多