gpt4 book ai didi

javascript - 如何在样式组件中获取当前窗口 pageYOffset?

转载 作者:行者123 更新时间:2023-11-29 22:57:36 26 4
gpt4 key购买 nike

我正在努力处理依赖于窗口的 scrollYOffset 的翻译动画。

我有这样的东西:

const StyledHeading = styled.h1`
font-size: ${({ theme }) => theme.fontSize.l};
letter-spacing: 1px;
font-family: ${({ theme }) => theme.font.firaSans};
margin: 0;
transition: 0.25s ease-in-out;
transform: translateX(${({ offset }) => (offset > 100 ? '-50px' : '0px')});
`;

export default function Navbar() {
const [offset, setOffset] = useState(window.pageYOffset);

useEffect(() => {
window.addEventListener('scroll', () => {
setOffset(window.pageYOffset);
});
});

return (
<StyledHeader >
<StyledWrapper>
<StyledHeading offset={offset}>
Bookphiles <i className="fas fa-book-open" />
</StyledHeading>
<nav>
<NavLinks />
</nav>
</StyledWrapper>
</StyledHeader>
);
}

但它似乎以非常低效的方式完成,因为每次滚动都会导致 DOM 重新渲染。可以用更好的方式完成吗?

最佳答案

恕我直言,如果你想避免断断续续的动画,你应该依赖 refs DOM 管理而不是 React render():

import React, { useState, useEffect, createRef } from 'react';

export default function Navbar() {
const ref = createRef();

useEffect(() => {
window.addEventListener('scroll', handleScroll);
});

handleScroll = (e) => {
const offset = window.pageYOffset;
ref.current.style.transform = `translateX(${({ offset }) => (offset > 100 ? '-50px' : '0px')})`;
}

return (
//...code
<StyledHeading ref={ref}>
Bookphiles <i className="fas fa-book-open" />
</StyledHeading>
//..code
);
}

请注意,我的代码中可能有一些拼写错误,但概念是不涉及滚动管理中的重新渲染。请记住在卸载组件之前删除监听器。

关于javascript - 如何在样式组件中获取当前窗口 pageYOffset?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56363644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com