警告:组件正在将未定义类型的受控输入更改为不受控制
Warning: A component is changing a controlled input of type undefined to be uncontrolled
尽管设置了初始状态,但在使用受控组件时我收到了以下警告:
警告:组件正在将未定义类型的受控输入更改为不受控制。输入元素不应从受控切换到不受控(反之亦然)。在组件的生命周期内决定使用受控或非受控输入元素。
这是我的代码:
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
尽管设置了初始状态,但在使用受控组件时我收到了以下警告: 警告:组件正在将未定义类型的受控输入更改为不受控制。输入元素不应从受控切换到不受控(反之亦然)。在组件的生命周期内决定使用受控或非受控输入元素。
这是我的代码:
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