React hooks引入useState
来设置组件状态。但是我该如何使用hooks来替换下面的回调函数:
setState(
{ name: "Michael" },
() => console.log(this.state)
);
状态更新后我想做一些事情。
我知道我可以使用 useEffect
来完成额外的操作,但是我需要检查前一个状态值,这需要写一些代码。我正在寻找一个简单的解决方案,可以与 useState
钩子一起使用。
React hooks引入useState
来设置组件状态。但是我该如何使用hooks来替换下面的回调函数:
setState(
{ name: "Michael" },
() => console.log(this.state)
);
状态更新后我想做一些事情。
我知道我可以使用 useEffect
来完成额外的操作,但是我需要检查前一个状态值,这需要写一些代码。我正在寻找一个简单的解决方案,可以与 useState
钩子一起使用。
useState
和 useCallback
:import React, { useCallback, useState } from 'react';
const Test = () => {
const [name, setName] = useState("");
const testCallback = useCallback(() => console.log(name), [name]);
return (
<button onClick={() => {
setName("Michael")
testCallback();
}}>Name</button>
)
};
export default Test;
const [Name, setName] = useState("");
...
onClick={()=>{
setName("Michael")
setName(prevName=>{...}) //prevName is Michael?
}}
prevName
不会是 "Michael",因为 useState
和类组件中的 setState
一样都是异步的。你不能在一行代码中更新状态并假设它已经在下一行发生了改变。你很可能会使用未更改的状态。 - Zsolt MeszarosUseEffect是主要的解决方案。但正如Darryl所提到的,使用useEffect并将状态作为第二个参数传递有一个缺陷,即组件将在初始化过程中运行。如果您只想使用更新后的状态值运行回调函数,可以设置一个本地常量,并在setState和回调中使用它。
const [counter, setCounter] = useState(0);
const doSomething = () => {
const updatedNumber = 123;
setCounter(updatedNumber);
// now you can "do something" with updatedNumber and don't have to worry about the async nature of setState!
console.log(updatedNumber);
}