在next.js中使用useEffect有不同方法吗?

6gpjuf90  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(121)

所以我写了一个React代码,当我向下滚动一个 neon 线从页面的顶部到页面的底部,问题是当我在next.js上尝试它时,它不起作用,错误是next.js行为空,有什么线索吗?
代码如下:

import React, { useState, useEffect } from "react";
import styles from "./Neon.module.css";
const Neon = () => {
  const [scrolling, setScrolling] = useState(false);
  useEffect(() => {
    const handleScroll = () => {
      setScrolling(true);
      const neonLine = document.querySelector(".nLine");
      const scrollTop = window.scrollY;
      const windowHeight = window.innerHeight;
      const documentHeight = document.documentElement.scrollHeight;
      const scrollPercentage = (scrollTop / (documentHeight - windowHeight)) * 100;
      neonLine.style.height = scrollPercentage + "%";
    };
    let scrollingTimeout;
    const checkScrollStop = () => {
      if (scrolling) {
        setScrolling(false);
        clearTimeout(scrollingTimeout);
      } else {
        const neonLine = document.querySelector(".nLine");
        neonLine.style.transition = "height 0.5s ease-in-out";
      }
    };
    window.addEventListener("scroll", handleScroll);
    window.addEventListener("scroll", checkScrollStop);
    return () => {
      window.removeEventListener("scroll", handleScroll);
      window.removeEventListener("scroll", checkScrollStop);
    };
  }, []);
  return (
    <div className={styles.con}>
      <div className={styles.neon}></div>
      <div className={styles.line}>
        <div className={styles["nLine"]}></div>
      </div>
    </div>
  );
};
export default Neon;

字符串

atmip9wb

atmip9wb1#

您有:

className={styles["nLine"]}

字符串

const neonLine = document.querySelector(".nLine");


假设styles["nLine"]的值为"nLine"
这是一个错误的假设。类名是随机的,这样你就可以在不同的组件中使用相同的名称,而不会发生冲突,也不会应用彼此的样式。
一般来说,你应该避免直接访问DOM。当你需要访问DOM时,使用a reference而不是搜索整个DOM。

const ref = useRef(null);
  useEffect(() => {
    const handleScroll = () => {
      setScrolling(true);
      const neonLine = ref.current;
...
    <div ref={ref} className={styles["nLine"]}></div>

相关问题