如何解决在 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 举报,一经查实,本站将立刻删除。