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

useState是同步的吗?[副本]

孙胜泫
2023-03-14

在过去,我们被明确警告调用setState({myProperty})是异步的,并且this.state.myProperty的值在回调或下一个render()方法之前无效。

使用useState,在显式更新状态后如何获取状态值?

钩子是如何工作的?据我所知,useState的setter函数不接受回调,例如。

const [value, setValue] = useState(0);
setValue(42, () => console.log('hi callback');

不会导致正在运行回调。

我在旧世界的另一个解决方法是在类上挂起一个实例变量(例如this.otherProperty=42),但这在这里不起作用,因为没有可重用的函数实例(在严格模式下没有this)。

共有2个答案

公孙盛
2023-03-14

嗯,如果你查阅相关文件,你会发现。。。

const [state, setState] = useState(initialState);

返回有状态值和更新该值的函数。

在初始渲染期间,返回的状态(state)与作为第一个参数传递的值相同。

setState函数用于更新状态。它接受一个新的状态值并使组件的重新呈现排队。

setState(newState);

在后续重新呈现期间,useState返回的第一个值将始终是应用更新后的最新状态。

因此,您的新状态,无论它是什么,都是您刚刚在useState中设置的,即初始状态的值。它直接进入state,之后会进行响应式更新。进一步引用相关文件:

调用useState是做什么的?它声明了一个“状态变量”。我们的变量叫做计数,但我们可以叫它其他任何东西,比如香蕉。这是一种在函数调用之间“保留”一些值的方法——useState是一种使用this.state在类中提供的完全相同的功能的新方法。通常,当函数退出时,变量“消失”,但状态变量由React保留。

如果您想在状态更新时执行某些操作,那么只需使用componentdiddupdate(docs)

丌官开宇
2023-03-14

您可以使用useffect访问更新后的最新状态。如果您有多个状态挂钩,并且只想跟踪其中一部分的更新,则可以将状态作为useffect函数的第二个参数在数组中传递:

useEffect(() => { console.log(state1, state2)}, [state1])

仅当更新了state1时,才会调用上述useffect,您不应该信任此函数中的state2值,因为它可能不是最新的值。

如果您想知道由useState创建的更新函数是否是同步的,也就是说,如果在使用钩子时更新了状态,那么这个答案可以提供一些深入了解。

 类似资料:
  • 一个问题是,我必须使整个ActionMethod异步,我不确定这会有什么影响。当前同步的基本模式如下: 有什么想法吗?

  • 我想将comment的键值更新为新值,同时保持其他键值不变。我知道我可能需要扩频器。。。但我不确定确切的语法。要实现这一点,我需要在setResource()中放入什么?

  • 问题内容: https://nodejs.org/api/fs.html#fs_fs_createreadstream_path_options。我也有一个一般性的问题。 我是否可以假设,除非文档中另有说明,否则提及的任何函数都是异步的? 问题答案: createreadstream是异步的吗? 是的,没有。这个问题实际上是一个语义问题,而不是任何问题,因为它在同步外观界面下隐藏了一个异步操作。

  • 我目前正在阅读Trevor Burnham的Async Javascript。到目前为止这是一本很棒的书。 他谈到这个片段和console.log在Safari和Chrome控制台中是“异步”的。不幸的是我无法复制这个。代码如下: 如果这是异步的,我会预期结果是books的结果。将console.log()放在事件队列中,直到所有代码执行完毕,然后运行它,它将具有bar属性。 虽然它是同步运行的,

  • 在方法中的一个中,给定我的,我将初始数据插入到DB中。除其他外,还有一些用户需要初始化。但是我将与一起使用,,后者只有异步方法,如下所示: 所以问题是,是否有一种方法可以将与一起使用而不会出现并发问题? 我尝试了从乐观并发模式中获得的以下方法,但它不会创建用户:

  • 我浏览了“http://www . IBM . com/developer works/Java/library/j-jtp 10264/”这篇文章。他们提到“锁框架是同步的兼容替代品”。我知道通过使用可重入锁,我们可以跨方法持有锁,等待锁一段时间(使用同步块(或)方法是不可能的)。我的疑问是,有没有可能用带有可重入锁的同步机制来代替应用程序? 例如,我想实现一个线程安全的堆栈数据结构,其中所有的