微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 react js 中获取钩子在 async / useState 内中的结果更新状态的解决方案

如何解决在 react js 中获取钩子在 async / useState 内中的结果更新状态的解决方案

如何使用 setState 在更新后正确获取结果状态。 这是我从中得到的代码示例,它与我的代码 Why react hook value is not updated in async function? 相似。但仍然没有解决该问题的答案。许多帮助将是有帮助的。谢谢

import React,{ Component,useState } from "react";
import { render } from "react-dom";

function App() {
 const [value,setValue] = useState('old');

 const run = async() => {
  setValue('new')
  const data = await wait(500)
  console.log(value)
 }

return (
  <button onClick={run}>
    Run
  </button>
);
}

 render(<App />,document.getElementById("root"));

 function wait(ms) {
   return new Promise(resolve => setTimeout(resolve,ms))
 }

解决方法

你需要像这样使用 my $foo_qfn = 'MAH'; my $bar_qfn = 'MAH2'; my %foos; { open(my $fh,'<',$foo_qfn) or die("Can't open \"$foo_qfn\": $!\n"); while ( my $foo_line = <$fh> ) { my $ssa = substr($foo_line,194,9); $foos{$ssa} = $foo_line; } } { open(my $fh,$bar_qfn) or die("Can't open \"$bar_qfn\": $!\n"); while ( my $bar_line = <$fh> ) { chomp($bar_line); my ($report4,$ssa) = split(/\|/,$bar_line); my $foo_line = $foos{$ssa}; ... } }

const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;

passport.serializeUser(function (user,done) {
    done(null,user);
});

passport.deserializeUser(function (user,user);
});

passport.use(
    new GoogleStrategy(
        {
            clientID:'secretClientID',clientSecret: 'enterClientSecret',callbackURL: 'http://localhost:3000/auth/google/callback',},function (accessToken,refreshToken,profile,done) {
            var userData = {
                email: profile.emails[0].value,name: profile.displayName,token: accessToken,};
            done(null,userData);
        },),);
,

您无法控制状态。反应控制。在您要求 React 更改存储状态后,您不应假设它何时会更新。也许下一毫秒,也许明年(我夸大其词只是为了说明这一点)。你的组件总是呈现当前状态,所以当 React 最终改变状态值时,它会重新运行你的组件。在单次运行中,您将状态值放入 React 未更新的变量中,因为它是本地的。它在 effect 内部是封闭的,即使 React 想要,它也不能为它不知道的变量分配新值。

由于您的组件是(不是真的,但为了简单起见,让我们坚持使用这个术语),您没有副作用。您可以礼貌地要求 React 对某些事件执行一些副作用 - DOM 事件(例如 onClick 以处理程序的形式放置副作用),或者在每次渲染时使用 useEffect 钩子。使用 useEffect 您可以限制 react 实际运行您的副作用的时间。使用依赖项数组,您可以说“嘿,React,您能否在初始渲染时以及更改此值时运行此副作用”。

综合起来,要跟踪状态值发生变化,您还需要一个 useEffect 钩子,您可以在其中 100% 确定状态值发生变化。它看起来像这样:

function App() {
  const [value,setValue] = useState("old");

  useEffect(
    function () {
      console.log(value);
    },[value]
  );
  const run = async () => {
    setValue("new");
    const data = await wait(500);
    console.log(value);
  };

  return <button onClick={run}>Run</button>;
}

但有时它也只是解决方案的一部分。有时您只想在依赖项值为“新”时运行副作用,而在“旧”时不运行它。在这种情况下,您可以在效果中添加额外的检查,如果不是您正在寻找的值,则提前返回

function App() {
  const [value,setValue] = useState("old");

  useEffect(
    function () {
      if (value !== "new") return;
      console.log(value);
    },[value]
  );
  const run = async () => {
    setValue("new");
    const data = await wait(500);
    console.log(value);
  };

  return <button onClick={run}>Run</button>;
}

虽然这几乎就足够了,但通常最好在自定义钩子中放置状态并与所述状态效果相关联,或者使用一些专用的“状态管理”解决方案,其中副作用是一等公民。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?