为何用const声明的useState变量可更新?count++为何不可用?
关于React useState的两个疑问解答
一、用const声明的count为啥能"更新"?
首先要明确:你根本没修改这个const声明的count变量。
React函数组件的运行逻辑是:每次状态更新时,整个组件函数(这里就是App)会重新执行一遍。每次执行时,useState(0)会返回新的状态值——这个新的count是一个全新的const变量,和上一次渲染的count完全不是同一个东西。
页面上数字增长,是因为组件重新渲染后,用了新的count值渲染<h1>。而之前渲染时的count变量(比如第一次的count=0)始终是const,没被修改过,只是后续渲染时换了新的变量而已。
补充一句:你代码里的console.log(count)其实输出的是当前increase函数捕获的旧count值,比如第一次点击按钮,console会输出0,而不是更新后的1——因为新的count要等下一次组件渲染才会生成,当前的increase函数还是用的上一次渲染时的count。
二、为啥能用count + 1更新状态,却不能用count++?
核心原因有两点:
- count是const变量,count++是赋值操作:
count++等价于count = count + 1,const声明的变量不允许被重新赋值,直接写count++会触发语法错误。 - 即使是let,count++也不适合更新状态:
count++是先返回当前值,再执行自增。如果写setCount(count++),传给setCount的其实是旧的count值,完全达不到更新的目的,还违背了React状态只能通过setter函数更新的原则。
如果要基于当前最新状态更新,更推荐用函数式更新的写法:
setCount(prevCount => prevCount + 1)
这种写法能确保拿到的是最新的状态值,避免闭包导致的旧值问题。
内容的提问来源于stack exchange,提问作者chu-js
相关产品推荐
相关产品推荐

