警告:组件正在将文本类型的受控输入更改为不受控制。 (反应.js)

Posted

技术标签:

【中文标题】警告:组件正在将文本类型的受控输入更改为不受控制。 (反应.js)【英文标题】:Warning: A component is changing a controlled input of type text to be uncontrolled. (React.js) 【发布时间】:2021-09-12 11:26:35 【问题描述】:

我有以下组件,我在输入中将用户的现有详细信息显示为值,用户应该能够更改这些详细信息并单击保存。但问题是它在控制台中显示以下错误:

  **index.js:1 Warning: A component is changing a controlled input of type text to be uncontrolled.**

这是组件代码:

const Settings = (props) => 
  const  createUser, isAuthenticated, history, errors  = props;
  const dispatch = useDispatch();
  const authUser = useSelector(state => state.auth.user);

  const [user, setUser] = useState(
    data: 
      name: "",
      email: "",
      password: "",
    ,
  );

  const [error, setError] = useState(
    nameError: "",
    emailError: "",
    passwordError: "",
  );

  useEffect(() => 
    setUser(
      data: 
        email:authUser.email,
      
    );    
  , [authUser]);


  const  name, email, password  = user.data;
  const  nameError, emailError, passwordError  = error;

  const onUpdateUser = (e) => 
    e.preventDefault();

    const isValid = formValidator(user.data, setError);

    if (isValid) 
      dispatch(updateUser(user.data))
    
  ;

  const onChange = (e) => 
    const  name, value  = e.target;
    const  data  = user;
    setUser(
      data: 
        ...data,
        [name]: value,
      ,
    );
  ;

  return (
    <BForm title="Create an account" handleSubmit=onUpdateUser>
      errors ? <p className="error-feedback">errors</p> : ""
      <BInput
        name="name"
        type="text"
        handleChange=onChange
        value=name
        placeholder="Your Name"
        error=nameError
        
      />
      <BInput
        name="email"
        type="email"
        handleChange=onChange
        value=email
        placeholder="Email"
        error=emailError
        required
      />
      <BInput
        name="password"
        type="password"
        value=password
        handleChange=onChange
        placeholder="Password"
        error=passwordError
        required
      />
      <div className="buttons">
        <BButton customClass="login-btn" isfullwidth=true type="submit">
          " "
          Save" "
        </BButton>
      </div>
    </BForm>
  );
;

export default Settings;

出了什么问题,如何解决?我需要让我们看到现有的值,然后改变他们想要的任何东西。

【问题讨论】:

这能回答你的问题吗? A component is changing an uncontrolled input of type text to be controlled error in ReactJS 检查您的useEffect,它将user.data 设置为只有email 属性。例如,如果您随后将文本添加到 password 字段,则 onChange 处理程序将传播仅包含 emailuser.data,然后 password[name]: value 设置,离开 name undefined = > 受控输入不受控制...? 确实如此。只有三个字段;考虑为每个值使用单独的useState 【参考方案1】:

useState 不允许像 setState 那样进行修补(即使这样做了,您的数据也嵌套在 data 键中,因此它仍然无法工作)。问题出在这一行:

  useEffect(() => 
    setUser(
      data: 
        email:authUser.email,
      
    );    
  , [authUser]);

它需要看起来像这样:

  useEffect(() => 
    setUser((data) => (
     data: 
      ...data,
      email:authUser.email
    
   ))
  , [authUser]);

否则,它将删除 namepassword 键,然后输入将具有 undefined 值(例如,变得不受控制)。

【讨论】:

【参考方案2】:

useEffect 有问题。因为您只更新电子邮件,所以namepassword 将丢失。所以这些输入的初始值会显示这个警告。你可以这样更新:

  useEffect(() => 
    setUser(preState => (
      data: 
        ...preState.data,
        email:authUser.email,
      
    ));    
  , [authUser]);

【讨论】:

以上是关于警告:组件正在将文本类型的受控输入更改为不受控制。 (反应.js)的主要内容,如果未能解决你的问题,请参考以下文章

警告:组件正在将文本类型的受控输入更改为不受控制。 (反应.js)

Material UI Select Component - 一个组件正在将文本类型的受控输入更改为不受控制

反应表单错误将类型文本的受控输入更改为不受控制

在 React 中更改受控输入值时发出警告

不受控制的输入 React Hooks

即使一切都受到控制,也会出现不受控制的输入错误