当前位置: 首页 > 知识库问答 >
问题:

ReactJS-警告:组件正在更改要控制的文本类型的非受控输入

魏宏邈
2023-03-14

我试图摆脱这个错误信息,但仍然没有成功。

Warning: A component is changing an uncontrolled input of type text to be controlled. Input elements should not switch from uncontrolled to controlled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component.

还有Facebook页面的链接,但我仍然不知道该如何找到它。

class EditItem extends Component {
    constructor(props) {
        super(props);
        this.state = {items: ''};

        this.addItemService = new ItemService();
        this.handleChange = this.handleChange.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
  }

  componentDidMount(){
    axios.get('http://localhost:3005/items/edit/'+this.props.match.params.id)
    .then(response => {
      this.setState({ items: response.data });
    })
    .catch(function (error) {
      console.log(error);
    })
  }

  handleChange = (e) => {
    let items = Object.assign({}, this.state.items);    //creating copy of object
    items.item = e.target.value;                        //updating value
    this.setState({items});
  }

  handleSubmit(event) {
    event.preventDefault(); // not sure why this
    this.addItemService.updateData(this.state.items.item, this.props.match.params.id); // service for updating the data
    this.props.history.push('/index'); // redirect
  }

  render() {
    return (
          <div className="container">
            <form onSubmit={this.handleSubmit}>
              <label>
                Edit Item:
                <input type="text" value={this.state.items.item} className="form-control" onChange={this.handleChange}/>
              </label><br/>
              <input type="submit" value="Update" className="btn btn-primary"/>
            </form>
        </div>
    );
  }
}

在输入似乎总是一个非空值,我如何解决这个问题?

共有2个答案

邹曦之
2023-03-14

当您尝试将未定义的值设置为任何输入类型时,这种类型的警告主要发生在React中。您可以使用条件运算符检查状态值是否未定义,如果未定义,则将其设置为空值。


<input type="text" value={this.state.items.item !== undefined ? this.state.items.item :  ''} className="form-control" onChange={this.handleChange}/>


冯宪
2023-03-14

在状态中,项被定义为字符串,因此当您将值分配给文本输入时,如

<input type="text" value={this.state.items.item} className="form-control" onChange={this.handleChange}/>

你本质上是在写作

<input type="text" value={undefined} className="form-control" onChange={this.handleChange}/>

对于初始渲染,一旦API调用的结果可用并且items状态更改为包含item key的对象,您将向input传递一个值,从而将其从非受控转换为受控,这就是警告的内容。为了避免警告,您只需初始化您的状态,如

this.state = {items: { items: '' }};

或者使用输入比如

<input type="text" value={this.state.items.item || ''} className="form-control" onChange={this.handleChange}/>
 类似资料:
  • 我一直有这个错误:一个组件正在将受控输入的类型文本更改为不受控制。输入元件不应从受控切换到不受控(反之亦然)。决定在组件的生命周期内使用受控或不受控制的输入元件。当我尝试将值从数据库输入框点击编辑 这是我的代码:

  • 问题内容: 警告:组件正在更改要控制的文本类型的不受控制的输入。输入元素不应从不受控制切换为受控制(反之亦然)。确定在组件的使用寿命中使用受控或非受控输入元素。* 以下是我的代码: 问题答案: 原因是,在您定义的状态下: 字段作为空白对象,因此在第一次渲染期间将是,输入字段的值将为: 因此,输入字段将变得不受控制。 在输入中输入任何值后,状态将变为: 那时输入字段被转换为受控组件;这就是为什么您得

  • 使用ui textfield时出错 警告:TextField正在将text类型的受控输入更改为不受控。输入元素不应从受控切换到非受控(或反之亦然)。决定在组件的生存期内使用受控还是不受控输入元素

  • 警告:组件正在更改要控制的非受控输入类型复选框。输入元件不应从不受控制切换到受控(反之亦然)。决定在组件的生命周期内使用受控或不受控制的输入元件。 我的代码:

  • 由另一个控制器控制的用户表单在控制台上抱怨“警告:一个组件正在将一个不受控的输入改变为受控的。这可能是由于值从未定义的值更改为已定义的值而导致的,这是不应该发生的。决定在组件的生命周期内使用受控还是不受控的输入元素。更多信息:https://reactjs.org/link/controlled-components输入跨度li ul ... " 这是组件代码: 我尝试了其他stackoverfl

  • 我得到了这个错误,我是新的反应。我看过其他帖子,但仍然不能解决这个问题。我们将不胜感激。谢谢 警告:组件正在更改要控制的电子邮件类型的未控制输入。输入元素不应该从不受控制切换到受控制(反之亦然)。决定在组件的生存期内使用受控还是不受控的输入元素。更多信息在输入(由编辑创建)中,在div(由编辑创建)中,在div(由编辑创建)中,在窗体(由编辑创建)中,在div(由编辑创建)中