如何在 React.JS 中添加 ClassName 并删除 onScroll 事件?

2024-01-29

我正在尝试制作一个粘性标题,可以根据他在页面上的位置更改其背景颜色。为此,我尝试将 className“active”添加到我的样式组件“StyledHeader”中,当滚动位置 Y 高于 400 像素时,它将出现,低于 400 像素时消失。

换句话说,我想做的是this http://jsfiddle.net/onigetoc/1e8k9q8b/但使用 React.JS、JSX 语法和样式组件。

这是我现在所拥有的:

import { Link } from '@reach/router';

import DuskLogo from '../images/dusk_logo.svg';

import { 
    StyledHeader, 
    StyledDuskLogo
} from '../styles/StyledHeader';

const Header = () => (
<StyledHeader>
  <div className="header-content">
    <Link to="/">
    <StyledDuskLogo src={DuskLogo} alt="dusk-logo" />
    </Link>
  </div>
</StyledHeader>
)

export default Header;

你知道一个简单的方法吗?


在您的中添加一个事件监听器useEffect。当你向下滚动值时window.scrollY将增加,例如 1, 2, ...100 ..(以 px 为单位)并更新您的color in useState根据window.scrollY https://developer.mozilla.org/en-US/docs/Web/API/Window/scrollY。尝试这样的事情

const StyledBody = window.styled.div`
  background: lightgray;
  height: 5000px;
`;

const StyledText = window.styled.h4`
  text-align: center;
  width: 250px;
  margin: auto;
  line-height: 40px;
`;

const StyledHeader = window.styled.div`
  background-color: ${props => props.color};
  width: 100%;
  height: auto;
  position: fixed;
  top: 0;
  left: 0;
  right: 0px;
  padding: 0;
  z-index: 10000;
  transition: all 1s ease-in-out;
`;

const Header = () => {
  const [color, setColor] = React.useState("rgba(17, 42, 107, 0.7)");

  const handleScroll = React.useCallback((event) => {
    let scrollTop = window.scrollY;

      //console.log(scrollTop );  //1,2,...100,...200...etc (in px)

      if (scrollTop >= 20 && scrollTop < 50) {
        setColor("yellow");
      }

      if (scrollTop >= 50 && scrollTop < 90) {
        setColor("red");
      }

      if (scrollTop >= 90 && scrollTop < 120) {
        setColor("green");
      }
      if (scrollTop >= 120 && scrollTop < 150) {
        setColor("blue");
      }
      if (scrollTop >= 150 && scrollTop < 180) {
        setColor("violet");
      }
      if (scrollTop >= 180 && scrollTop < 210) {
        setColor("purple");
      }
});

  React.useEffect(() => {
    window.addEventListener("scroll", handleScroll);
    return () => {
      window.removeEventListener("scroll", handleScroll, false);
    };
  }, []);

  return (
    <StyledBody>
      <StyledHeader color={color}>
        <StyledText>My background color changes</StyledText>
      </StyledHeader>
    </StyledBody>
  );
};

export default Header;

这是一个工作演示..根据您的需要更改代码。demo http://jsfiddle.net/blueseal/hLjq1bex/50/

编辑:我已经为您添加了样式组件。检查一下并告诉我它是否适合您。要了解有关这些挂钩的更多信息,请访问useEffect https://stackoverflow.com/a/53465182/5124488 and useCallback https://stackoverflow.com/a/54569923/5124488

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 React.JS 中添加 ClassName 并删除 onScroll 事件? 的相关文章

随机推荐

  • Node 中数千个并发 http 请求

    我有一个包含数千个 URL 的列表 我想通过 http 请求进行健康检查 healt php 这是我的问题 我在节点中编写了一个应用程序 它以集中的方式发出请求 我使用一个变量来控制打开的并发连接数 300 即 一个接一个 每个请求都那么快
  • js 文件中的 php WordPress

    在 js 文件中 我需要获取 WordPress 主题的模板目录 即我需要获取以下值的返回值在 js 文件中 这个想法是这样的 var blogTemplateDir 如何才能实现这一目标 执行此操作的标准 Wordpress 方法是什么
  • 拥有多个步骤文件会打开多个浏览器

    问题 如果我有多个 Steps 文件 当我执行测试时 似乎无论我运行哪个测试 都会为每个 Steps 文件创建 WebDriver 每当我运行测试时 我都会看到一个看似随机的 Chrome 浏览器打开 为了查看 SpecFlow 和 Chr
  • 如何替换已在 Java 中打印在屏幕上的文本?

    我是 Java 新手 为了了解更多信息 我尝试制作一个时钟 它工作得很好 除了每次更改时它都会在新行上打印这一事实之外 我该如何制作才能用新时间替换已经打印出来的文本 public class test public static void
  • 当边缘用 jQuery 显示时停止拖动

    这是该网站的链接 战争游戏地图 http game creeight se 我有一个大的 jQuery 可拖动 div 将地图图像设置为背景 里面有一个较小的 div 上面有溢出 隐藏 重点是让用户像在maps google com 上一样
  • 绘制距原点 X 公里的路线

    跑步 步行距离显示 用户输入位置和距离 我可以以用户输入的距离为半径覆盖一个圆 以用户的位置为中心点 我可以在用户设置的距离处围绕原点设置四个基点 N S E W 并绘制到这些点的路线 这样 B 点距 A 点 100 公里 但映射的路线是
  • 如何优化以下代码

    颜色和尺寸是使用 django 中的 GET 方法从 URL 获取的 颜色和大小是复选框输入 并作为 view py 文件中的列表接收 https i stack imgur com abQ9Z png 我正在使用颜色和尺寸属性过滤我的产品
  • 在 R 中取消列出列,同时将字符(0)保留为空字符串

    我对 R 比较陌生 我有一个数据框 其中有一列存储为列表 我的专栏包含c Benzo Ferri or character 0 如果它是空的 我怎样才能将它们更改为简单的Benzo Ferri并用空字符串代替字符 0 例如 我无法df ge
  • Hyper-V W10(主机)Ubuntu 18.04(访客):为什么增强会话模式不起作用?

    我已使用 Hyper V 在 Windows 10 主机系统上安装了 Ubuntu 18 04 作为来宾系统 并且我想在全屏模式下使用来宾系统 据我所知 要调整屏幕大小 我需要在增强会话模式下运行来宾系统 如果我连接到访客系统 它既不允许我
  • python 错误 AttributeError: 'str' 对象没有属性 'setdefault'

    我正在尝试使用此命令运行 django 项目 python manage py runserver 8080 但每次我尝试运行时都会遇到这样的错误 Traceback most recent call last File manage py
  • 如何孵化PolyCollection实例?

    是否可以孵化 PolyCollection 实例 我想要从 fill Betweenx 返回一个 PolyCollection import matplotlib mlab as mlab from matplotlib pyplot im
  • Java,解析我知道为空的 JSON 对象

    我有一个 JSON 对象数组 为了解析这些数组并存储简单的数据类型值 我必须假设键名称并相应地存储它们 我还知道有时键的值将为空 例子 promotion null 我将如何解析这个 如果我尝试访问值为 null 的键 则会收到 JSONE
  • 异常 java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSource

    我正在尝试将 spring 和 Hibernate 与 mysql 集成 我创建了一个简单的 java 项目和一个包含 3 个类的包 一个应用程序 context xml 文件和一个用于映射的 hbm xml 但执行后 我得到这个错误 Er
  • Ruby 递归函数

    我在从递归函数返回值时遇到问题 def ask question question print question answer STDIN gets chomp ask question question if answer empty r
  • 来自 Google Play 的 SSL 警告

    收到来自 google play 的警告 我如何处理 WebViewClient onReceivedSslError 处理程序的不安全实现的 SSL 错误处理程序漏洞 请尽快解决此漏洞并增加升级后的APK的版本号 为了正确处理SSL证书验
  • Redux / RTK:为一个切片创建增强器?

    在我的 Redux RTK 存储中的一个切片中 要使该切片完成其工作 我所需要做的就是使用以下命令创建一个实体适配器createEntityAdapter https redux toolkit js org api createEntit
  • 类变量、范围解析运算符和不同版本的 PHP

    我在 codepad org 中尝试了以下代码 class test const TEST testing 123 function test testing TEST echo self testing class new test 它返
  • 如何编写自定义 POCO 串行器/解串器?

    我想为 FIX 消息编写一个自定义 NET 序列化器 反序列化器 与 XML 不同 基本上该消息的编码为
  • 使用用户名和密码登录后如何抓取网站

    我编写了一个网络爬虫 可以使用关键字抓取网站 但我想登录到我指定的网站并按关键字过滤信息 如何实现这一点 我发布了到目前为止我已经完成的代码 public class DB public Connection conn null publi
  • 如何在 React.JS 中添加 ClassName 并删除 onScroll 事件?

    我正在尝试制作一个粘性标题 可以根据他在页面上的位置更改其背景颜色 为此 我尝试将 className active 添加到我的样式组件 StyledHeader 中 当滚动位置 Y 高于 400 像素时 它将出现 低于 400 像素时消失