我有一个简单的react组件的形式,我相信有一个受控的输入:

import React from 'react';

export default class MyForm extends React.Component {
    constructor(props) {
        super(props);
        this.state = {}
    }

    render() {
        return (
            <form className="add-support-staff-form">
                <input name="name" type="text" value={this.state.name} onChange={this.onFieldChange('name').bind(this)}/>
            </form>
        )
    }

    onFieldChange(fieldName) {
        return function (event) {
            this.setState({[fieldName]: event.target.value});
        }
    }
}

export default MyForm;

当我运行我的应用程序,我得到以下警告:

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

我相信我的输入是受控的,因为它有一个值。我在想我做错了什么?

我使用的是React 15.1.0


当前回答

这种情况通常只发生在应用程序启动时,您没有控制字段的值,而在某些事件或某些函数触发或状态改变后,您现在试图控制输入字段中的值。

这种从无法控制输入到可以控制输入的转变是导致问题发生的首要原因。

避免这种情况的最佳方法是在组件的构造函数中为输入声明一些值。 这样,输入元素在应用程序开始时就有了值。

其他回答

我也有同样的问题。 问题是当我保持状态信息空白

  const [name, setName] = useState()

我通过像这样添加空字符串来修复它

  const [name, setName] = useState('')

就我而言,我错过了一些非常微不足道的东西。

<输入值= {state.myObject。inputValue} / >

当我收到警告时,我的状态如下:

state = {
   myObject: undefined
}

通过交替我的状态来引用我的值的输入,我的问题得到了解决:

state = {
   myObject: {
      inputValue: ''
   }
}

我在type='radio'时遇到了同样的问题

<input type='radio' checked={item。电台}…/>

原因就是那件物品。例如,无线电并不总是真或假,而是真或未定义。确保它总是布尔值,问题就会消失。

<input type='radio' checked={!!电台}…/>

请试试这段代码

import React from "react";

class MyForm extends React.Component {
    constructor(props) {
        super(props);
        this.state = { name: "" };
        this.onFieldChange = this.onFieldChange.bind(this);
    }

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

    render() {
        return (
            <form className="add-support-staff-form">
                <input name="name" type="text" value={this.state.name} onChange={this.onFieldChange} />
        </form>
        );
    }
}

export default MyForm;

对于使用Formik的用户,需要为表单的initialValues添加特定字段名的默认值。