我想从数据库中获取数据,然后将其填充到相应的字段中。然后我希望能够编辑它们并保存更改。但是,我有几个问题的文本字段。
已填充字段的图像:
如果我使用这样的东西:
const [lname, setLname] = useState("");
<TextField
fullWidth
label="Last name"
name="lname"
required
value = { `${userDetails.lname}` || "" }
onChange={(e) => setLname(e.target.value)}
/>
然后文本字段变成只读的,我认为这是因为一旦我使用了onChange
,它就再次使用这里的常量值填充字段。
如果将value
更改为defaultValue
,则可以更新值,但初始值为undefined
。
如果我使用这样的东西:
const [lname, setLname] = useState(userDetails.lname);
<TextField
fullWidth
label="Last name"
name="lname"
required
value = {lname}
onChange={(e) => setLname(e.target.value)}
/>
初始TextField
变为空。
UserDetails的填充方式如下:
export default function ProfileDetails() {
const { user } = useContext(UserContext);
const [userDetails, setUserDetails] = useState({});
const { dispatch, isFetching } = useContext(UserContext);
useEffect(() => {
axios
.get("http://localhost:42690/api/users/user-details", {
headers: { Authorization: `Bearer ${user.token}` },
})
.then((res) => {
console.log(res.data.fetchedUser);
setUserDetails(
(prevState) => ( { ...prevState, ...res.data.fetchedUser })
);
})
.catch((err) => {
toast.error("Failure to Load Profile");
});
}, []);
有人能帮我解决这个问题吗?谢谢!
2条答案
按热度按时间uoifb46i1#
对于一个输入,具有不同的状态
userDetails
和lname
(在姓氏的情况下)不是一个好主意,这就是导致您的问题的原因。我建议您只使用userDetails
,并根据正在更改的输入更新它,例如:注意我添加的注解
oknwwptz2#
您必须添加
useEffect
以在userDetails.lname
值可用时更新您的状态: