javascript - 将类组件转换为函数组件 - 根据滚动位置展开/折叠标题
问题描述
我的目标是将这个类组件变成一个函数组件。
然而,我的功能组件实现的问题是,当我向上滚动时,标题会立即展开。如果页面位于绝对顶部,我只希望标题可见。
import React, { useState, useEffect } from "react";
import classnames from "classnames";
import "./header.styles.scss";
const Header = () => {
const [isHidden, setIsHidden] = useState(0);
const [prevScrollPos, setPrevScollPos] = useState(window.pageYOffset);
useEffect(() => {
function handleScrollChange() {
setIsHidden(prevScrollPos < window.pageYOffset);
setPrevScollPos(window.pageYOffset);
}
window.addEventListener("scroll", handleScrollChange);
return () => {
window.removeEventListener("scroll", handleScrollChange);
};
});
return (
<div
className={classnames("header", {
"header-hidden": isHidden,
})}
>
<div className="logo-container">A & A Solutions</div>
<div className="options">
<div className="option">Option 1</div>
<div className="option">Option 2</div>
<div className="option">Option 3</div>
</div>
</div>
);
};
export default Header;
解决方案
您可以检查该window.scrollY
属性并查看它是否为 0。这意味着窗口滚动条的 Y 轴顶部位于最顶部。
function handleScrollChange() {
setIsHidden(window.scrollY !== 0);
}
作为旁注,我认为您不应该在每次发生副作用时添加和清理事件侦听器。您可能会考虑使用[]
依赖项,useEffect
因为您可以省略检查prevScrollPos
如果你想运行一个效果并且只清理一次(在挂载和卸载时),你可以传递一个空数组([])作为第二个参数。这告诉 React 你的效果不依赖于任何来自 props 或 state 的值,所以它永远不需要重新运行。
推荐阅读
- ruby-on-rails - 在 ruby 的侧数组中迭代哈希数组
- php - 无法在 WordPress 网站中使用 Barba js 进行简单的页面转换
- html - 创建一个类似 css 形状的泪珠,无需旋转,并以图像为背景
- java - App crashes after accessing data from SQLite Database android
- visual-studio-code - 如何在 VS 代码上启用这些建议?
- docker - JTL-Shop / admin / 无法使用 Traefik 登录
- angular - Angular中如何过滤数据?
- javascript - Aframe 按组件选择
- parameters - 通过 IEnumerable
Blazor WASM 中的 API 方法 - python - Python中的ValueError,数组中的索引数不匹配