Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs React无法将useEffect与setState inside函数一起使用_Reactjs_React Native - Fatal编程技术网

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
异常。只是检查属性是否存在并访问它。