J'ai créé un composant React pour une navigation fixe que je voudrais garder caché, jusqu'à ce que je fasse défiler un certain point de la page, puis que je glisse en vue. Moyen a un en-tête similaire à ce que je décris.
C'est une tâche relativement triviale dans jQuery , avec scrollmagic ou waypoints, mais existe-t-il un moyen idiomatique d'accomplir cela avec React et Vanilla JS?
React Way avec Vanilla JS jsfiddle ;
n'oubliez pas de supprimer EventListener. Dans cet exemple, le composant sera rendu si seulement il est nécessaire
class TopBar extends React.Component {
state = { isHide: false };
hideBar = () => {
const { isHide } = this.state
window.scrollY > this.prev ?
!isHide && this.setState({ isHide: true })
:
isHide && this.setState({ isHide: false });
this.prev = window.scrollY;
}
componentDidMount(){
window.addEventListener('scroll', this.hideBar);
}
componentWillUnmount(){
window.removeEventListener('scroll', this.hideBar);
}
render(){
const classHide = this.state.isHide ? 'hide' : '';
return <div className={`topbar ${classHide}`}>topbar</div>;
}
}
Vous pouvez utiliser un composant tel que react-headroom pour faire le gros du travail pour vous. Ou, vous pouvez toujours utiliser des waypoints dans React, en le configurant dans componentDidMount
méthode du cycle de vie et en le supprimant en utilisant componentWillUnmount
.
J'ai créé un composant React pour ce même besoin exact car je n'ai trouvé aucune autre implémentation correspondant à ce dont j'avais besoin. Même react-headroom
ne vous a pas donné quelque chose qui défilerait juste après avoir atteint un certain point sur la page.
The Gist est ici: https://Gist.github.com/brthornbury/27531e4616b68131e512fc622a61baba
Je ne vois aucune raison de copier le code du composant ici. Le code est largement basé sur le react-headroom
code mais fait moins et est donc plus simple.
Le composant est le premier morceau de code, vous pouvez simplement copier/coller puis l'importer. Après avoir importé votre code avec la barre de navigation, cela ressemblerait à ceci:
class MyScrollInNavBar extends Component {
render() {
return (
<ScrollInNav scrollInHeight={150}>
<MyNavBar />
</ScrollInNav>
);
}
}
Dans le hook de cycle de vie componentDidMount
, faites la même chose que dans le lien jQuery que vous avez donné:
class Navbar extends React.component {
let delta = 5;
render() {
return (
<div ref=header></div>
);
}
componentDidMount() {
$(window).scroll(function(event){
var st = $(this).scrollTop();
if(Math.abs(this.state.lastScrollTop - st) <= delta)
return;
if (st > lastScrollTop){
// downscroll code
// $(this.refs.header).css('visibility','hidden').hover ()
this.setState({
navbarVisible: false
});
} else {
// upscroll code
$(this.refs.header).css('visibility','visible');
this.setState({
navbarVisible: true
});
}
lastScrollTop = st;
}.bind(this));
}
}