【发布时间】:2018-05-06 13:50:30
【问题描述】:
tl;dr 向下滚动查看适合我的解决方案!
如何在react中实现固定导航栏上下滑动?
使用 refs 或使用 componentDidMount 生命周期挂钩的更好方法是什么?
hideNav = (navbar) => {
const hide = () => {
let lastScrollTop = 0;
const currentScrollTop = navbar.scrollTop;
// scroll down
if (currentScrollTop > lastScrollTop) {
navbar.classList.add('hidden');
} else {
// scroll up
navbar.classList.remove('hidden');
}
lastScrollTop = currentScrollTop;
};
window.addEventListener('scroll', hide);
};
...在渲染方法中进一步向下:
render() {
return <Navbar ref={this.hideNav} />
更新:
解决方案:
class Navbar extends React.Component {
state = {
auth: false,
slide: 0, // How much should the Navbar slide up or down
lastScrollY: 0, // Keep track of current position in state
};
componentWillMount() {
// When this component mounts, begin listening for scroll changes
window.addEventListener('scroll', this.handleScroll);
}
componentWillUnmount() {
// If this component is unmounted, stop listening
window.removeEventListener('scroll', this.handleScroll);
}
handleScroll = () => {
const { lastScrollY } = this.state;
const currentScrollY = window.scrollY;
if (currentScrollY > lastScrollY) {
this.setState({ slide: '-48px' });
} else {
this.setState({ slide: '0px' });
}
this.setState({ lastScrollY: currentScrollY });
};
render() {
return (
<Navbar
style={{
transform: `translate(0, ${this.state.slide})`,
transition: 'transform 90ms linear',
}}
/>
);
}
}
我还没有进行任何优化,因此建议使用 requestAnimationFrame、setTimeout 或 customEvent 来限制事件。 Like here.
【问题讨论】:
标签: javascript html css reactjs jsx