UseState 是同步的吗?

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

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

这个怎么用钩子?据我所知,useState的 setter 函数不接受回调,例如。

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

不会导致运行回调。

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

156991 次浏览

如果你参考相关的 医生你会发现..。

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

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

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

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

setState(newState);

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

所以你的新状态,不管它是什么,就是你刚刚在 useState中设置的值,也就是 initialState的值。它直接连接到 statestate随后被动更新。进一步引用相关的 医生:

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

如果您希望在状态更新时执行某些操作,那么只需使用 componentDidUpdate.(docs) < a href = “ https://reactjs.org/docs/response-Component ent.html # Component entdid update”rel = “ nofollow noReferrer”> (docs)

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

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

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

如果您对 useState创建的 update 函数是否是同步的感到好奇,也就是说,如果使用 hook 时 React 批处理状态更新,那么 这个答案会提供一些有关它的见解。