当前位置: 首页 > 知识库问答 >
问题:

UseState显示以前的值始终[duplicate]

何兴学
2023-03-14

这是所有新react开发人员的一个普遍问题,但不知何故,我无法理解可用解决方案背后的逻辑。我试图使用钩子更新状态变量,并尝试它读取更新后的值,但它总是返回以前的值而不是新值。下面是我代码执行的顺序。

onClick={setTransactionAccountId}

单击按钮时,它执行以下代码并更新状态,但console.log显示旧值。

const [accountId, setAccountId] = useState(0);

const setTransactionAccountId = e => {
  console.log("Clicked ID:", e.currentTarget.value);
  setAccountId(e.currentTarget.value);
  console.log("accountId:", accountId);
};

控制台日志:

  1. 单击第一个按钮:

单击的ID:0 AccountID:0

单击的ID:1 AccountId:0

谁能告诉我这种行为背后的原因和如何解决。

共有3个答案

澹台季萌
2023-03-14

这是因为setstate是异步的。在状态更新之前执行console.log('account id:',accountId)仍然会给出以前的状态值。如果您添加了Async/Await,那么应该可以解决这个问题。

null

const setTransactionAccountId = async (e) => {
    console.log('Clicked ID:', e.currentTarget.value)
    await setAccountId(e.currentTarget.value)
    console.log('accountId:', accountId)
}
邹禄
2023-03-14

来自react文档

React可能会将多个setState()调用批处理到一个更新中以提高性能。

因为this.props和this.state可能是异步更新的,所以您不应该依赖于它们的值来计算下一个状态。

状态更新可能是批处理和异步更新的,因此在调用console.log()时状态可能没有更新。您将在下一次调用useEffect钩子时得到保证更新的结果。

司空赞
2023-03-14

accountId将不会在此呈现中更新。您必须等待下一次呈现以更新它。只有在调用useState时,AccountId才会填充到函数组件的顶部。你在渲染的中间。如果需要实际值,请不断从e.currenttarget.value中提取它。

 类似资料:
  • 我似乎无法找到为所有文件启用行号的设置,但我必须始终右键单击并根据每个文件启用此设置。 这必须有一个全局设置,对吧?

  • 我是FCM的新手。我不能让FCM使用我的应用图标作为通知图标,图标总是一个白色的空白。 我将一个图标导入到文件夹,但似乎没有任何改变。就像一些人说的,这是因为这个问题中的Lollipop通知 但问题是,FCM通知自动弹出,我无法让通知生成器覆盖图标。我怎么改?

  • 问题内容: 我想始终显示输入“数字”字段的上/下箭头。这可能吗?到目前为止,我还没有任何运气… HTML: CSS: 问题答案: 您可以使用Opacity属性(至少在Chrome中)实现此目的: 如上所述,这可能仅在Chrome中有效。因此,请谨慎使用此代码,不要对其他浏览器进行回退。

  • 我希望始终显示输入“数字”字段的上/下箭头。这可能吗?到目前为止我还没有任何运气 http://jsfiddle.net/oneeezy/qunbnL6u/ HTML: CSS:

  • 问题内容: 下面是我的代码。 Calendar.HOUR应该给我 public static final int HOUR get和set的字段号,指示上午或下午的时间。HOUR用于12小时制(0-11)。中午和午夜用0而不是12表示。例如,在10:04:15.250 PM,小时是10。 不管我运行该代码多少次,它总是给我相同的unique_id。(101213),而我在计算机上的本地时间是下午1

  • 问题内容: 我使用JFace 在我的JFace行的单元格中显示一个按钮,该按钮在激活时会触发对话框。此行为在以下代码中效果很好,但是只有在显式选择了托管按钮的表的单元格时,该按钮才会出现。 有没有一种方法可以强制按钮始终显示在表格中,而不仅是在选中单元格时?(相同的行为适用于通过重写方法设置的标签) 谢谢 问题答案: 您一次只能编辑一个单元格。除非您进行一些自定义,否则将不支持一次编辑多个单元格。