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

以下是我的代码:

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>
  )
}

当前回答

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

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 || '') = ''

其他回答

我也面临同样的问题。在我的例子中,解决方案是我错过了向元素添加“name”属性。

<div className="col-12">
   <label htmlFor="username" className="form-label">Username</label>
        <div className="input-group has-validation">
             <span className="input-group-text">@</span>
                  <input 
                      type="text" 
                      className="form-control" 
                      id="username"
                      placeholder="Username" 
                      required=""
                      value={values.username}
                      onChange={handleChange}
                  />
                  <div className="invalid-feedback">
                      Your username is required.
                  </div>
        </div>
</div>

在我在属性的输入列表中引入name=username之后,效果很好。

更改此

  const [values, setValues] = useState({intialStateValues});

为此

  const [values, setValues] = useState(intialStateValues);

即使将undefined设置为上一次渲染时的值(甚至在正确初始化之前),也会出现问题。

问题在于更换

value={value}

with

value={(value==undefined?null:value)}

我使用react钩子遇到了同样的警告,尽管我之前已经将初始状态初始化为:-

const[post,setPost]=useState({title:“”,body:“”})

但后来我重写了onChange事件处理程序上预定义状态对象的一部分,

 const onChange=(e)=>{
        setPost({[e.target.name]:e.target.value})
    }

解决方案我通过首先处理前一状态的整个对象(通过使用扩展运算符),然后在其上进行编辑来解决这个问题,

 const onChange=(e)=>{
        setPost({...post,[e.target.name]:e.target.value})
    }

这样地

value={this.state.fields && this.state.fields["name"] || ''}

为我工作。

但我将初始状态设置为:

this.state = {
  fields: [],
}