有没有比 onChange 更简洁的方法将输入字段连接到 React 中的状态属性?

IT技术 reactjs
2021-05-01 22:24:42

因此,请查看下面的代码作为我们的示例,输入字段上的简单 2 路数据绑定将字段连接到属性inputValue

但是假设您有一个包含 30 个或更多输入的更复杂的页面。你应该写30+onChange类中的处理程序,所有对应于像输入不同的名称onNameChangeonEmailChangeonPhoneChange,等?有没有比我下面的更简洁、更隐式的输入绑定方式?

React.createClass({
  getInitialState() {
    inputValue: ''
  },
  render() {
    return (
      <input
        type='text'
        value={this.state.inputValue}
        onChange={this.onChange} />
    );
  },
  onChange(e) {
    this.setState({ inputValue: e.target.value });
  }
});

编辑:我想我可以这样做并避免在类上编写处理程序:

<input onChange={ e => this.setState({firstName: e.target.value}) } />

那是犹太洁食吗?

2个回答

React docs 有你的解决方案:

https://facebook.github.io/react/docs/forms.html#handling-multiple-inputs

    class NameForm extends React.Component {
      constructor(props) {
        super(props);
        this.state = {value: ''};

        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
      }

   handleInputChange(event) {
    const target = event.target;    
    this.setState({
      [target.name]: target.value
    });
  }

      handleSubmit(event) {
        alert('A name was submitted: ' + this.state.value);
        event.preventDefault();
      }

      render() {
        return (
          <form onSubmit={this.handleSubmit}>
            <label>
              Name:
              <input name="name" type="text" value={this.state.name} onChange={this.handleInputChange} />
            </label>
            <label>
              Email:
              <input name="email" type="text" value={this.state.email} onChange={this.handleInputChange} />
            </label>
                  <label>
              Pet:
              <input name="country" type="text" value={this.state.country} onChange={this.handleInputChange} />
            </label>
            <input type="submit" value="Submit" />
          </form>
        );
      }
    }

更简洁的方法是使用单个onChange处理程序并将 id 传递给它,并使用该 id 存储值。你的解决方案看起来像

React.createClass({
  getInitialState() {

  },
  onChange(e, type) {
     this.setState({[type]: e.target.value})

  },
  render() {
    return (
      <input
        type='text'
        value={(this.state.inputValue)? this.state.inputValue: ''}
        onChange={this.onChange.bind(this, 'inputValue')} />
      <input
        type='text'
        value={(this.state.emailValue)? this.state.emailValue: ''}
        onChange={this.onChange.bind(this, 'emailValue')} />
    );
  },
  onChange(e) {
    this.setState({ inputValue: e.target.value });
  }
});

该值由 a 给出,ternary operator expression因为最初状态未定义,因此我们将得到一个warning that input is trying to change the uncontrolled input to controlled.

另一种方法是让处理程序内联,如

onChange={ e => this.setState({inputValue: e.target.value}) }

但是假设您有 30 个输入,您需要定义它们的初始状态并让它像上面一样设置其值,唯一的区别是分配给它的值应该与第一个示例中所示的表达式相同

另一种为@MayankShukla 建议的输入赋值的方法是

value = {this.state.inputValue || ''}

与 getInitialState 看起来像

getInitialState() {
    return {}
},