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

以下是我的代码:

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

其他回答

const [name, setName] = useState()

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

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

将修复此字符串示例上的问题。

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

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

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

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

对于功能部件:

const SignIn = () => {

  const [formData, setFormData] = useState({
    email: "",
    password: ""
  });

  
  const handleChange = (event) => {
    const { value, name } = event.target;
    setFormData({...formData, [name]: value });
  };


  const handleSubmit = (e) => {
    e.preventDefault();
    console.log("Signed in");
    setFormData({
      email: "",
      password: ""
    });
  };


  return (
    <div className="sign-in-container">
      <form onSubmit={handleSubmit}>
        <FormInput
          name="email"
          type="email"
          value={formData.email}
          handleChange={handleChange}
          label="email"
          required
        />
        <FormInput
          name="password"
          type="password"
          value={formData.password}
          handleChange={handleChange}
          label="password"
          required
        />
        <CustomButton type="submit">Sign in</CustomButton>
      </form>
    </div>
  );
};

export default SignIn;

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

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

将值更改为defaultValue将解决该问题。

注:

defaultValue仅用于初始加载。如果要初始化输入,则应使用defaultValue,但如果要使用state更改值,则需要使用value。阅读此内容了解更多信息。

我在输入中使用了value={this.state.input ||“”}来消除该警告。