Reactjs React无法将useEffect与setState inside函数一起使用
我有一个场景,在Reactjs React无法将useEffect与setState inside函数一起使用,reactjs,react-native,Reactjs,React Native,我有一个场景,在按钮单击时调用异步函数,返回值设置状态值。之后,调用另一个函数,该函数需要先前设置的值。由于它在函数内部,我无法使用useffect。如何做到这一点 const [user, setUser] = React.useState(null); const handleSignIn = async () => { const result = await Google.logInAsync(config); const { type, idToken } =
按钮单击时调用异步函数,返回值设置状态值。之后,调用另一个函数,该函数需要先前设置的值。由于它在函数内部,我无法使用useffect
。如何做到这一点
const [user, setUser] = React.useState(null);
const handleSignIn = async () => {
const result = await Google.logInAsync(config);
const { type, idToken } = result;
setUser(result?.user);
if (type === "success") {
AuthService.googleSignIn(idToken)
.then((result) => {
const displayName = `${user?.givenName} ${user?.familyName}`;
signIn({
uid: user.uid,
displayName: displayName,
photoURL: user.photoUrl,
});
})
.catch((error) => {
});
}
};
在这里,点击按钮调用handleSignIn
,并根据从Google.logInAsync
获得的结果设置user
状态值。然后调用AuthService.googleSignIn
,当成功时,会在那里使用用户
对象,但有时不可用。cbr的评论一针见血。您需要将setUser
之后的所有内容包装在其自身的useffect
中,这取决于user
状态变量。像这样:
const[result,setResult]=React.useState(null);
const handleSignIn=async()=>{
const result=await Google.logInAsync(config);
设置用户(结果);
};
useffect(()=>{
如果(结果){
const{type,idToken,user}=result;
如果(类型==“成功”){
AuthService.googleSignIn(idToken)
。然后((结果)=>{
const displayName=`${user?.givenName}${user?.familyName}`;
签名({
uid:user.uid,
displayName:displayName,
photoURL:user.photoURL,
});
})
.catch((错误)=>{
});
}
}
}[结果])
这里发生的是您的handleSignIn
设置user
变量。每当更新user
变量时,useffect
就会运行。如果存在,它将使用新的用户
值运行您的AuthService
代码
或者,您可以直接引用您的结果.user
跳过使用useffect
。从结果
以及类型
和idToken
中提取它,并直接使用它。如果以后需要,您仍然可以使用setUser
功能将其保存为state:
const[user,setUser]=React.useState(null);
const handleSignIn=async()=>{
const result=await Google.logInAsync(config);
const{type,idToken,user}=result;
setUser(用户);
如果(类型==“成功”){
AuthService.googleSignIn(idToken)
。然后((结果)=>{
const displayName=`${user?.givenName}${user?.familyName}`;
签名({
uid:user.uid,
displayName:displayName,
photoURL:user.photoURL,
});
})
.catch((错误)=>{
});
}
};
这是否回答了您的问题@cbr,在选择关闭之前,请花一些时间仔细查看问题:)我必须在按钮中调用的函数单击。在render中是否可以访问useEffect
中的函数?我链接了那篇文章,因为在if(type==“success”)
中,您可以访问user
变量,该变量将为null,因为setUser(result?.user)
不会同步更新函数闭包中的值。您需要将result.user
赋值到一个局部变量中,然后在处理程序中使用该变量。你到底需要useEffect做什么?您的意思是想将函数从内部if(type==“success”)
移动到useffect钩子中吗?@cdr,只需使用局部变量即可。谢谢你也可以使用Google.logInAsync
中的result
变量,如果你从AuthService.googleSignIn
重命名result
参数,那么它就不会对你想要使用的另一个result
产生阴影。const{type,idToken}=result
来自result
,而不是const{type,idToken}=user代码>你是对的。我稍微修改了一下。现在,状态变量是整个结果
,您可以从中提取用户
。概念是一样的though@cbr是这里真正的英雄。附带问题:我看到您使用的是结果?用户语法。我以前没有看到过,除了在一篇关于ES20的文章中,我还不知道ES20真的被使用了。那是什么语法?那是为了防止null
异常。只是检查属性是否存在并访问它。