【问题标题】:Input elements should not switch from controlled to uncontrolled ReactJs error输入元素不应从受控切换到不受控的 ReactJs 错误
【发布时间】:2017-09-27 10:52:41
【问题描述】:

我正在尝试处理表单中的更改。我有标题、描述和类别。

第一个输入(标题) -> 无法在字段中输入。

第二个输入(描述) -> 可以输入字段但结果未定义。

第三个输入(类别 DDL)-> 无法更改所选类别,但默认选择在我的 alret 中输出为“drink”;

问题:

AddDeal 正在将文本类型的受控输入更改为 不受控制。输入元素不应从受控切换到 不受控制(反之亦然)。决定使用受控或 在组件的生命周期内不受控制的输入元素。

我在此处查看了有关受控组件的 react 文档,但由于我是新手,因此很难理解。

https://facebook.github.io/react/docs/forms.html#controlled-components

这是我的AddDeal.js代码

export default class AddDeal extends React.Component {
  constructor(props) {
    super(props);

    // Set the state
    this.state = {
      title: '',
      description: '',
      category: 'technology'
    };

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

  onSubmit(e) {
    e.preventDefault();

    alert('Title is: ' + this.state.title + 'Description is: ' + this.state.description + 'Category is: ' + this.state.category);
  }

  handleChange(e) {
    this.setState({
      title: e.target.title,
      description: e.target.description,
      category: e.target.value
    });
  }

  render() {
    return (
    <div>
      <h1>Add Deal</h1>
      <form onSubmit={this.onSubmit}>
        <label><input value={this.state.title} onChange={this.handleChange} type="text" name="title"/></label>
        <label><input value={this.state.description} onChange={this.handleChange} type="text" name="description" /></label>
        <select value={this.state.category} onChange={this.handleChange}>
            <option value="technology">Technology</option>
            <option value="food">Food</option>
            <option value="drink">Drink</option>
            <option value="books">Books</option>
          </select>
        <input type="submit" value="Submit"/>
      </form>
    </div>
    );
  }
}

为什么获取输入如此困难?我应该使用道具而不是状态吗?谢谢。

【问题讨论】:

  • 对不起,我从未看过这篇文章,但在阅读之后,使用状态处理输入变得更加清晰。谢谢

标签: javascript reactjs meteor


【解决方案1】:

问题出在onChange function,您使用的是通用的 onChange 函数,因此不是用相同的值更新所有值,而是更新特定的状态值。

使用此功能:

handleChange(e) {
    this.setState({
        [e.target.name] : e.target.value
    }); 
}

使用name属性更新具体状态,需要用select字段定义name='category'

检查工作示例:

class AddDeal extends React.Component {
  constructor(props) {
    super(props);

    // Set the state
    this.state = {
      title: '',
      description: '',
      category: 'technology'
    };

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

  onSubmit(e) {
    e.preventDefault();

    alert('Title is: ' + this.state.title + 'Description is: ' + this.state.description + 'Category is: ' + this.state.category);
  }

  handleChange(e) {
    this.setState({
        [e.target.name] : e.target.value
    });
  }

  render() {
    return (
    <div>
      <h1>Add Deal</h1>
      <form onSubmit={this.onSubmit}>
        <label><input value={this.state.title} onChange={this.handleChange} type="text" name="title"/></label>
        <label><input value={this.state.description} onChange={this.handleChange} type="text" name="description" /></label>
        <select name='category' value={this.state.category} onChange={this.handleChange}>
            <option value="technology">Technology</option>
            <option value="food">Food</option>
            <option value="drink">Drink</option>
            <option value="books">Books</option>
          </select>
        <input type="submit" value="Submit"/>
      </form>
    </div>
    );
  }
}

ReactDOM.render(<AddDeal/>, document.getElementById('app'))
<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='app'/>

【讨论】:

  • @MaynakShukla 工作完美,谢谢!我仍然不明白为什么我不能通过单独针对表单中的所有事件来处理Change,但我正在学习。
  • 我是否也可以将所有 3 个上的输入值更改为 {this.state.value} 并以这种方式获得结果?
  • 没有得到第一个问题。您可以为每个字段使用单独的 onChange 处理程序,但在这里您使用的是通用更改,因此该函数将被任何一个字段调用,因此您只需要更新与该字段关联的状态变量。 第二个问题: 不,因为 this.state.value 不存在,您对不同的字段有单独的状态变量。如果您需要任何其他帮助,请告诉我:)
【解决方案2】:

把你的函数改成

 handleChange(e) {
    this.setState({
        [e.target.name] : e.target.value
    }); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 2019-05-07
    • 2020-07-08
    • 2018-08-28
    • 2020-07-27
    • 2020-08-27
    • 2017-06-30
    • 2020-02-14
    相关资源
    最近更新 更多