为何调用useState的setTest后,scrollY滚动时可持续打印,不调用则仅打印一次?
问题解答
核心原因在于React组件的重新渲染触发机制,咱们一步步拆解:
1. 调用setTest(scrollY)时的情况
- 每次页面滚动,
handleScroll会被触发,调用setTest(scrollY)更新test状态。 - React中,状态更新会强制组件触发重新渲染。
- 组件每次重新渲染时,
return语句里的console.log(scrollY)都会执行一次,而此时的scrollY是当前滚动位置的最新值,所以你能看到每次滚动都打印新的数值。
2. 不调用setTest(scrollY)时的情况
- 页面滚动时,
handleScroll依然会被触发,但没有更新任何组件状态。 - 组件只有在初始挂载和状态/ props变化时才会重新渲染,这里没有状态更新,所以组件只会在最开始渲染一次,
console.log(scrollY)也就只执行一次——哪怕滚动事件一直在触发,组件不重新渲染,这段代码就不会再跑。
补充说明
- 你代码里的
useEffect依赖是空数组[],所以事件监听只会在组件挂载时绑定一次,卸载时移除,这个逻辑没问题。 - 另外,
return里直接写{console.log(scrollY)}其实是把console.log的返回值(undefined)作为JSX元素渲染,虽然能打印,但这不是规范写法,建议调试时把console.log放在组件顶层或者useEffect里,避免不必要的渲染执行。
内容的提问来源于stack exchange,提问作者user7151127
相关产品推荐
相关产品推荐

