I am creating a bootstrap navigation where the navigation menu items are hidden until you scroll to the full height of the device/desktop browser viewport. They are showing on initial page load but once you scroll they hide and then reappear after scroll.
Its being controlled by adding hide and show classes. But, the hide classes are added on page load.
Any idea about how to prevent the classes from being added on refresh/initial page load?
Navigation:
import React from 'react';
import { Collapse, Navbar, NavbarToggler, NavbarBrand, Nav, NavItem, NavLink } from 'reactstrap';
export default class Example extends React.Component {
constructor(props) {
super(props);
this.toggle = this.toggle.bind(this);
this.state = {
isOpen: false,
width: 0,
height: 0
};
this.updateWindowDimensions = this.updateWindowDimensions.bind(this);
}
toggle() {
this.setState({
isOpen: !this.state.isOpen
});
}
state = {
isTop: true,
};
componentDidMount() {
this.updateWindowDimensions();
window.addEventListener('resize', this.updateWindowDimensions);
document.addEventListener('scroll', () => {
const isTop = window.scrollY < window.innerHeight;
if (isTop !== this.state.isTop) {
this.setState({ isTop })
}
});
}
componentWillUnmount() {
window.removeEventListener('resize', this.updateWindowDimensions);
}
updateWindowDimensions() {
this.setState({ width: window.innerWidth, height: window.innerHeight });
}
render() {
return (
<div>
<Navbar color="light" light expand="md">
<NavbarBrand href="/">Maryland <span>Brand</span></NavbarBrand>
<NavbarToggler onClick={this.toggle} />
<Collapse isOpen={this.state.isOpen} navbar>
<Nav className="ml-auto" navbar>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink className="active" href="/">Our Brand</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Logos</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Color</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Typography</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Imagery</NavLink>
</NavItem>
<NavItem className={this.state.isTop ? 'hide' : 'show fadeIn'}>
<NavLink href="/">Editorial</NavLink>
</NavItem>
<NavItem>
<NavLink className="red bold uppercase show" href="/">Communicators Toolkit</NavLink>
</NavItem>
</Nav>
</Collapse>
</Navbar>
</div>
);
}
}
The issue here is that the state
is initialised twice. Once as a class field and other in the constructor.
The one in constructor takes precedence over the other and since isTop
is missing there, it ends up being undefined
Move the isTop
initialisation into the constructor:
this.state = {
isOpen: false,
width: 0,
isTop: true,
height: 0
};
and the navbar should be hidden by default