状态更新器功能在类和功能组件中都是必需的。this.setState
不应与 一起使用this.state
,这同样适用于useState
状态和状态设置器。还有更多的情况useState
时,不使用状态更新将导致错误的行为。
在类组件中,使用 的唯一问题this.state
是由于异步状态更新导致的竞争条件:
componentDidMount() {
this.setState({ count: this.state.count + 1 });
this.setState({ count: this.state.count + 1 }); // overwrites with stale count
console.log(this.state.count); // not updated
}
当没有竞争条件时,this.state
可以在组件内的任何地方访问,因为this
引用保持不变:
componentDidMount() {
this.setState({ count: this.state.count + 1 });
setTimeout(() => {
this.setState({ count: this.state.count + 1 });
}, 100)
setTimeout(() => {
console.log(this.state.count);
}, 200)
}
在功能组件中,使用useState
状态的问题是功能范围。没有像这样的对象可以通过引用访问,状态是通过值访问的,在重新渲染组件之前不会更新:
const [count, setCount] = useState(0);
useEffect(() => {
// runs once on mount
// count is always 0 in this function scope
setCount({ count: count + 1 });
setTimeout(() => {
setCount({ count: count + 1 }); // overwrites with stale count
}, 100)
setTimeout(() => {
console.log(count); // not updated
}, 200)
}, []);