警告:组件正在将类型为undefined的受控输入更改为uncontrol

问题描述

尽管已设置初始状态,但在使用受控组件时仍收到以下警告: 警告:组件正在将undefined类型的受控输入更改为uncontrol。输入元素不应从受控状态切换到非受控状态(反之亦然)。在组件的生命周期中决定使用受控还是不受控制的输入元素。

这是我的代码

import React,{ useState } from "react";

function App() {
    const [fullName,setFullName] = useState({
        fName: "",lName: ""
    });

    function handleChange(event) {
        const { value,name } = event.target;

        setFullName(prevValue => {
            if (name === "fName") {
                return {
                    fName: value,lName: prevValue.lName
                };
            } else if (name === "lName") {
                return {
                    fName: prevValue.fName,lname: value
                };
            }
        });
    }

    return (
        <div className="container">
            <h1>
                Hello {fullName.fName} {fullName.lName}
            </h1>
            <form>
                <input
                    name="fName"
                    onChange={handleChange}
                    placeholder="First Name"
                    value={fullName.fName}
                />
                <input
                    name="lName"
                    onChange={handleChange}
                    placeholder="Last Name"
                    value={fullName.lName}
                />
                <button>Submit</button>
            </form>
        </div>
    );
}

export default App;

如果我在输入中输入 John 作为 fName Doe 作为 lName ,则标题应是 Hello John Doe ,但我刚得到 Hello John 的警告。使用下面的条件可以消除警告,但是我再次得到 Hello John

value={fullName.lName || ""}

如何在没有警告的情况下同时显示 fName lName

解决方法

这是由于输入错误而发生的。 更改:

else if (name === "lName") {
   return {
      fName: prevValue.fName,lname: value
   };
}

收件人:

else if (name === "lName") {
   return {
      fName: prevValue.fName,lName: value // notice 'n' was in lowercase.
   };
}

另外,一种更简洁的处理方式(我认为)是:

setFullName((prevValue) => ({
    ...prevValue,[name] : value
}));

工作示例:here