useState 是同步的吗?

IT技术 javascript reactjs react-hooks
2021-02-01 17:34:27

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

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

这如何与钩子一起工作?据我所知,setter 函数useState不接受回调,例如

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

不会导致运行回调。

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

2个回答

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

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

以上useEffect只会在state1更新时被调用,你不应该相信state2这个函数内部值,因为它可能不是最新的。

如果您对创建的更新函数useState是否同步感到好奇,即 React 是否在使用钩子时批量更新状态,这个答案提供了一些洞察力。

请注意,如果您在状态中使用对象或数组,则需要在 的第二个数组参数中进行设置useEffect,例如useEffect(() => ..., [state.prop])
2021-03-17 17:34:27
是的 b/c 这个新的 react hooks 增加了更多的问题。恕我直言,反应 15 更好
2021-03-19 17:34:27
我需要在 onPress 函数中执行此操作。但是,useEffect 只能在函数组件的主体中调用。还有其他解决方案吗?
2021-03-20 17:34:27
这对我的情况没有帮助 - state1 可以被多个事件更改,我无法判断哪个事件触发了状态更改。非常感谢旧语法await setState(...)
2021-03-23 17:34:27

好吧,如果您参考相关文档,您会发现...

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

返回一个有状态的值和一个更新它的函数。

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

setState 函数用于更新状态。它接受一个新的状态值并将组件的重新渲染排入队列。

setState(newState);

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

所以你的新状态,不管它是什么,就是你刚刚在 中设置的useState,即 的值initialState它直接转到state,此后响应更新。进一步引用相关文档

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

如果您想在状态更新时做某事,那么只需使用componentDidUpdate. (文档)

如果 React Hooks 在 2 月 6 日发布了 16.8,那么 Claire Lin 是如何在 1 月 10 日引用 Hooks 的?
2021-03-13 17:34:27
2 月 6 日,钩子在稳定版本中可用,尽管几个月前很多人已经在生产中使用它们。
2021-03-18 17:34:27
如果 OP 已经在使用钩子,他最useEffect好像其他回答者指出的那样使用。
2021-03-22 17:34:27