警告:组件正在更改要控制的文本类型的非受控输入。输入元件不应从非受控切换到受控(反之亦然)。决定在部件的使用寿命内使用受控或非受控输入元件*

以下是我的代码:

constructor(props) {
  super(props);
  this.state = {
    fields: {},
    errors: {}
  }
  this.onSubmit = this.onSubmit.bind(this);
}

....

onChange(field, e){
  let fields = this.state.fields;
  fields[field] = e.target.value;
  this.setState({fields});
}

....

render() {
  return(
    <div className="form-group">
      <input
        value={this.state.fields["name"]}
        onChange={this.onChange.bind(this, "name")}
        className="form-control"
        type="text"
        refs="name"
        placeholder="Name *"
      />
      <span style={{color: "red"}}>{this.state.errors["name"]}</span>
    </div>
  )
}

当前回答

如上所述,您需要设置初始状态,在我的例子中,我忘记在setSate()中添加“”引号;

  const AddUser = (props) => {
  const [enteredUsername, setEnteredUsername] = useState()
  const [enteredAge, setEnteredAge] = useState()

出现以下错误

正确的代码是简单地将初始状态设置为空字符串“”

  const AddUser = (props) => {
  const [enteredUsername, setEnteredUsername] = useState('')
  const [enteredAge, setEnteredAge] = useState('')

其他回答

可以应用多种方法:

基于类的方法:使用本地状态并使用默认值定义现有字段:

constructor(props) {
    super(props);
    this.state = {
      value:''
    }
  }
<input type='text'
                  name='firstName'
                  value={this.state.value}
                  className="col-12"
                  onChange={this.onChange}
                  placeholder='Enter First name' />

在功能型组件中使用Hooks React>16.8:

[value, setValue] = useState('');
<input type='text'
                  name='firstName'
                  value={value}
                  className="col-12"
                  onChange={this.onChange}
                  placeholder='Enter First name' />

如果使用propTypes并在HOC组件为函数样式的情况下为propTypes提供默认值。

 HOC.propTypes = {
    value       : PropTypes.string
  }
  HOC.efaultProps = {
    value: ''
  }

function HOC (){

  return (<input type='text'
                  name='firstName'
                  value={this.props.value}
                  className="col-12"
                  onChange={this.onChange}
                  placeholder='Enter First name' />)

}


原因是,在您定义的状态中:

this.state = { fields: {} }

字段作为空白对象,因此在第一次渲染过程中,this.state.fields.name将未定义,输入字段的值将为:

value={undefined}

因此,输入字段将变得不受控制。

在输入中输入任何值后,状态中的字段将更改为:

this.state = { fields: {name: 'xyz'} }

此时,输入场被转换为受控分量;这就是为什么会出现错误:

组件正在将文本类型的非受控输入更改为受约束的。

可能的解决方案:

1-将状态中的字段定义为:

this.state = { fields: {name: ''} }

2-或使用短路评估定义值属性,如下所示:

value={this.state.fields.name || ''}   // (undefined || '') = ''

首先设置当前状态。。。此状态

这是因为当您要分配一个新状态时,它可能是未定义的。因此,它也将通过设置状态提取当前状态来固定

this.setState({...this.state, field})

如果您的状态中有一个对象,则应按如下方式设置状态:,假设您必须在用户对象内设置用户名。

this.setState({user:{...this.state.user, ['username']: username}})

如果值不存在或为null,则放入空值。

value={ this.state.value || "" }

使用React Hooks也不要忘记设置初始值。我使用的是<input-type='datetime-local'value={eventStart}/>,初始eventStart是这样的

const[eventStart,setEventStart]=useState();相反const[eventStart,setEventStart]=useState(“”);。

括号中的空字符串是差异。此外,若您像我一样在提交后重置表单,那个么再次需要将其设置为空字符串,而不仅仅是空括号。

这只是我对这个话题的一点小小贡献,也许会对某人有所帮助。