一个组件正在将类型文本的不受控制的输入更改为ReactJS中的受控错误

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

以下是我的代码:

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>
  )
}
Tom凯飞云2020/03/10 13:36:13

除了接受的答案,如果您使用的input是类型checkboxradio,我还发现我还需要对null / undefined进行检查checked

<input
  id={myId}
  name={myName}
  type="checkbox" // or "radio"
  value={myStateValue || ''}
  checked={someBoolean ? someBoolean : ''}
  />
神乐前端2020/03/10 13:36:12

简单地说,您必须先设置初始状态

如果您未设置初始状态,则 react会将其视为不受控制的组件

西里小哥2020/03/10 13:36:12
const [name, setName] = useState()

在文本字段中键入后立即生成错误

const [name, setName] = useState('') // <-- by putting in quotes 

将解决此字符串示例的问题。

老丝镜风2020/03/10 13:36:12

更改valuedefaultValue将解决该问题。

注意事项

defaultValue仅用于初始负载。如果要初始化,input则应使用defaultValue,但如果要使用state来更改值,则需要使用value阅读更多。

我曾经value={this.state.input ||""}input摆脱这一警告的。

阿飞古一A2020/03/10 13:36:12

在组件内部,以以下方式放置输入框。

<input className="class-name"
              type= "text"
              id="id-123"
              value={ this.state.value || "" }
              name="field-name"
              placeholder="Enter Name"
              />