【问题标题】:React input box no longer worksReact 输入框不再起作用
【发布时间】:2020-06-19 17:15:32
【问题描述】:

我是新手,当我将状态从变量更改为对象时,输入框不再起作用。

以下代码有效

 class AddMovie extends Component {

  state = {
    title: "",
    watched: ""
  }

  onChangeMovie = (e) => {
    this.setState({[e.target.name] : e.target.value});
  }

  uploadMovie = (e) => {
    e.preventDefault();
    this.props.addMovie(this.state.title, this.state.watched);
    this.setState({title: "", watched: ""})
  }
  render(){
    return (
      <form onSubmit={this.uploadMovie}>
        <div className="form-group">
          <label>Movie Title</label>
          <input type="text" className="form-control"  placeholder="Enter title"
          name="title" value={this.state.title} onChange={this.onChangeMovie}/>
        </div>
        <div className="form-group">
          <label>Date Watched</label>
          <input type="date" className="form-control"
          name="watched" value={this.state.watched} onChange={this.onChangeMovie}/>
        </div>
        <button type="submit" className="btn btn-primary">Submit</button>
      </form>
    )
  }
}

export default AddMovie;

当我将状态更改为对象时

  state ={
    movieUpload: {
      title: "",
      watched: ""
    }
  }

我更改表单以添加对象

  render(){
    return (
      <form onSubmit={this.uploadMovie}>
        <div className="form-group">
          <label>Movie Title</label>
          <input type="text" className="form-control"  placeholder="Enter title"
          name="title" value={this.state.movieUpload.title} onChange={this.onChangeMovie}/>
        </div>
        <div className="form-group">
          <label>Date Watched</label>
          <input type="date" className="form-control"
          name="watched" value={this.state.movieUpload.watched} onChange={this.onChangeMovie}/>
        </div>
        <button type="submit" className="btn btn-primary">Submit</button>
      </form>
    )
  }

输入框不再起作用。为什么会这样?如何更改?

【问题讨论】:

  • 您是否正在根据您的新状态形状更改您的onChangeMovie 方法?
  • @devserkan 我没有。我应该怎么做才能改变它?
  • 请看我的评论以获取已接受的答案。

标签: reactjs object input


【解决方案1】:

如果您要进行这些更改,您还需要更改您的onChangeMovie

onChangeMovie = (e) => {
  this.setState({uploadMovie: {...this.state.uploadMovie, [e.target.name] : e.target.value}});
}

这将复制当前的this.state.uploadMovie,然后覆盖标题/观看。

【讨论】:

  • 我给出了一个答案,但这是一个接近的答案。我建议在这里使用函数setState,因为我们依赖于旧值movieUpload。喜欢:onChangeMovie = e =&gt; { const { target } = e; this.setState(prevState =&gt; ({ movieUpload: { ...prevState.movieUpload, [target.name]: target.value } })); };
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2019-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多