![](/img/trans.png)
[英]how to update an object using useEffect in Reactjs and Typescript
[英]How to make functional update of reactjs state object property correctly inside useEffect hook
我的初始化代码如下
const userData = useSelector(state => state.userData); // Obtain from redux state
const [formData, setFormData] = useState({
userId : '',
name : '',
email : ''
});
我想在 useEffect 挂钩中更新 formData 的 userId,但我在终端中收到以下警告
React Hook useEffect 缺少依赖项:'formData'。 包括它或删除依赖数组。 如果您在“setFormData”调用中只需要“formData”,也可以进行功能更新“setFormData(f =>...)”
我的 useEffect 代码如下。
useEffect(() => {
if(userData.userId !== ""){
setFormData({...formData,userId:userData.userId})
}
}, [userData]);
如果我将依赖项 formData 添加到 useEffect 它会给我控制台上的错误警告:超出最大更新深度
useEffect(() => {
if(userData.userId !== ""){
setFormData({...formData,userId:userData.userId})
}
}, [userData,formData]);
请让我知道一个正确的解决方案,提前谢谢
这可能是理想的方法:
如果您在“setFormData”调用中只需要“formData”,也可以进行功能更新“setFormData(f =>...)”
基本上,您可以更改setFormData
调用以使用当前 state 内部的任何内容,而不是直接依赖formData
:
useEffect(() => {
if(userData.userId !== ""){
setFormData(f => ({ ...f, userId: userData.userId }))
}
}, [userData]);
出于所有意图和目的,它仍然是formData
的相同值。 唯一的区别是,如果多个 state 更新在单个操作中排队,则此回调语法在批量更新中使用当前 state,而不是在渲染时显式 Z9ED39E2EA931586B6A985A6942EF573E。
对于这种特殊情况,它将formData
变量作为依赖项删除。 (尽管它可能希望您将setFormData
添加到依赖项数组中,这不会影响任何事情。)
只需添加// eslint-disable-next-line react-hooks/exhaustive-deps
即可修复第一个警告。
useEffect(() => {
if(userData.userId !== ""){
setFormData({...formData,userId:userData.userId})
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [userData]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.