我正在试着听卷轴活动. 以下是我转换的原始代码.

document.addEventListener("scroll", function(){
const headerChange = document.querySelector("header");
if (window.scrollY > 0) {
headerChange.classList.add("scrolled");
} 
else {
headerChange.classList.remove("scrolled");
} 
})

虽然这是我在我的react 代码中转换它的方式.

const [isScrolling, setIsScrolling] = useState(false);
    const navRef = useRef();


    const navScroll = () => {

        setIsScrolling(window.scrollY > 0 ? 
        navRef.current.classList.add("scrolled") 
        :  navRef.current.classList.remove("scrolled"));
        console.log(navScroll)
    }

return (
<nav
    ref={navRef} 
    onScroll={() => isScrolling}>

</nav>

)


滚动页面时未能触发Scroll事件

请问,滚动功能未能触发的原因可能是什么?

推荐答案

你需要听页面滚动,而不是nav滚动,所以你仍然需要使用document.addEventListener('scroll', handleScroll);.侦听DOM事件是一个副作用,应该由useEffect来处理.当事件被激发时,你应该更新状态,状态的改变应该改变className-className={isScrolling ? 'scrolled' : ''.

const Header = () => {
  const [isScrolling, setIsScrolling] = useState(false);
  
  useEffect(() => {
    const handleScroll = () => setIsScrolling(window.scrollY > 0);
    
    document.addEventListener('scroll', handleScroll);
    
    return () => { // cleanup
      document.removeEventListener('scroll', handleScroll);
    };
  }, []);

  return (
    <nav className={isScrolling ? 'scrolled' : ''}>
    ...
    </nav>
  )
}

Javascript相关问答推荐

使用Astro和React的动态API

仅在React和JS中生成深色

如何通过onClick为一组按钮分配功能;

Cypress -使用commands.js将数据测试id串在一起失败,但在将它们串在一起时不使用命令有效

IMDB使用 puppeteer 加载更多按钮(nodejs)

如何解决chrome—extension代码中的错误,它会实时覆盖google—meet的面部图像?'

JQuery. show()工作,但. hide()不工作

在vercel throws上部署带有gunjs的sveltekit应用无法找到模块./' lib/文本编码'

如何在angular中从JSON值添加动态路由保护?

嵌套异步JavaScript(微任务和macrotask队列)

如何禁用附加图标点击的v—自动完成事件

构造HTML表单以使用表单数据创建对象数组

手机上的渲染错误文本必须在文本组件中渲染,但在浏览器上没有问题<><>

如何将Cookie从服务器发送到用户浏览器

为什么useState触发具有相同值的呈现

我可以使用使用node.js创建的本地主机来存储我网站上提交的所有数据吗?没有SQL或任何数据库.只有HTML语言

VUE 3捕获错误并呈现另一个组件

JavaScript是否有多个`unfined`?

JavaScript&;Reaction-如何避免在不使用字典/对象的情况下出现地狱?

按特定顺序将4个数组组合在一起,按ID分组