无法在异步方法中设置 useState 变量并控制台记录它

Posted

技术标签:

【中文标题】无法在异步方法中设置 useState 变量并控制台记录它【英文标题】:Unable to set useState variable in async method and console log it 【发布时间】:2022-01-22 18:52:58 【问题描述】:

我正在和我的朋友一起开发一个应用程序项目,当我们尝试设置使用状态并且控制台记录变量时,我们多次发现问题,我在网站上寻找解决方案,发现原因是usestate 是一个异步 awiat,这意味着我在使用状态中设置的变量并未立即设置在其中,因此我尝试了许多在网站上找到的解决方案,但它们都不适合我。 在屏幕截图中,您可以看到 json 变量之前在控制台日志中,而 set 变量在 setActiveUser 之后没有显示,有什么帮助吗?

谢谢!

【问题讨论】:

【参考方案1】:

如果你想在设置状态时做一些事情,那么最好的办法是使用 React 中的 useEffect 钩子并将你的状态添加到依赖数组中。这将在每次状态更改时调用您的 useEffect 中的函数。下面是一个粗略的例子:

import  Text  from 'react-native';

const MyComponent = () => 
  const [activeUser, setActiveUser] = useState(null);

  useEffect(() => 
    // This should log every time activeUser changes
    console.log( activeUser );
  , [activeUser]);

  const fetchAuthentication = async user => 
    var flag = false;
    await fetch('/api/authUser/', 
      method: 'PUT',
      headers:  'Content-Type': 'application/json' ,
      body: JSON.stringify(user),
    )
      .then(res => 
        res.ok && (flag = true);
        return res.json();
      )
      .then(json => 
        if (flag) 
          setActiveUser(json);
        
      )
      .catch(error => console.error(error));
    return flag;
  ;

  return <Text>Hi</Text>;
;

完整文档:https://reactjs.org/docs/hooks-effect.html

【讨论】:

以上是关于无法在异步方法中设置 useState 变量并控制台记录它的主要内容,如果未能解决你的问题,请参考以下文章

在要在后台(异步)任务类(Java/Android)中访问的类方法中设置变量

如何测试在视图控制器单元测试中设置私有变量的方法?

无法在 Java 8 中设置实例变量值

在异步函数或 Promise 中设置全局变量的值? [复制]

无法使用钩子在 React 中设置状态

如何在路径中设置变量并在模板中显示?