reactjs - 为什么我的 useState() 钩子没有在 useEffect() 中设置新状态?
问题描述
试图检测<section>
元素是否集中在视口中,我无法 console.log单个 true
语句。我正在[isFocused, setIsFocused]
为此实现一个钩子。
这是我的窗口:
我需要这样当Section 2
位于窗口顶部时,会出现一个console.log(true)
。但是会发生这种情况:
这是我的实现:
import React, { useEffect, useRef, useState } from "react";
const SectionII = (props) => {
const sectionRef = useRef();
const [isFocused, setIsFocused] = useState(false);
const handleScroll = () => {
const section = sectionRef.current;
const { y } = section.getBoundingClientRect();
if(!isFocused && y <= 0) {
setIsFocused(true);
console.log(isFocused, y);
}
};
useEffect(() => {
window.addEventListener('scroll', handleScroll);
return () => window.removeEventListener('scroll', handleScroll);
}, []);
return (
<section id="mentorship" ref={sectionRef} style={{borderTop: "1px solid"}}>
<h1>Section 2</h1>
<button>Set hash</button>
</section>
);
};
export default SectionII;
为什么我的状态不能通过true
insidesetIsFocused(true)
更新if(!isFocused && y <= 0)
?
非常感谢您的洞察力。我真的被困住了。
解决方案
当您在 react 中使用任何状态管理时,您需要确保在尝试访问新状态值之前设置更改。对于您的示例,您立即console.log(isFocused, y)
遵循您的 setState 函数(更改只会出现在下一个 DOM 渲染中)。相反,您应该使用带有设置状态函数的回调,setIsFocused(true, () => console.log(isFocused, y))
.
推荐阅读
- node.js - 在 MongoDB 中使用引用而不是带有 _ids 的字符串有优势吗?
- google-cloud-platform - 如何将 Cloud SQL 产品数据库与另一个 Cloud SQL 暂存数据库同步?
- php - 合并两个子数组
- ruby-on-rails - 如何在 Rails 中获取 ApplicationRecord 模型的验证约束?
- flutter-dependencies - 任务 ':app:processDebugResources' 执行失败。飘飘然
- c - 使用 MPI Alltoallw 处理不同子阵列尺寸的 3D 阵列散射
- java - 将数据推送到 BigQuery 中的现有表
- c# - Openxml SDK CreateFromTemplate 示例
- webots - 精准转动机器人
- python - 如何在 AngularJS 网站上使用 Python 中的 Selenium 迭代和保存动态表中的信息