2016-06-30 35 views
10

Ho creato un componente React per un navigatore fisso che vorrei rimanere nascosto, fino a quando non oltrepasso un determinato punto della pagina, quindi scorro in vista. Medium ha un'intestazione simile a quella che sto descrivendo.Come rivelare un componente React su scroll

Questo è un compito relativamente banale in jQuery, con scrollmagic o waypoint ma esiste un modo idiomatico di eseguire ciò con React e vanilla JS?

risposta

0

nel gancio componentDidMount ciclo di vita, fanno la stessa cosa, come nel link jQuery hai dato:

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)); 

    } 
} 
+4

Vedo che sei molto interessato ad aiutare gli altri con React, ma potresti per favore prendere un po 'di tempo per formattare ogni risposta? Non è una gara o un gioco di quantità, si tratta di qualità. Formattare correttamente gli snippet di codice e controllare la punteggiatura non è così difficile :) –

+0

Ok signore Si prenderà cura di questo, sto cercando di migliorare, lo so –

+0

Questa è un'ottima risposta, ma sfortunatamente, non sto usando jQuery su questo progetto e stava cercando un modo per realizzare questo con solo React e vanilla JS. – Wilhelm

5

Reagire Way con vaniglia JS jsfiddle;

non dimenticare di rimuovere EventListener. In questo esempio componente renderà se non altro è neccessary

class TopBar extends React.Component { 
    constructor(props){ 
     super(props); 
     this.state={isHide:false}; 
     this.hideBar = this.hideBar.bind(this) 
    } 
    hideBar(){ 
     let {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(){ 
     let classHide=this.state.isHide?"hide":"" 
     return <div className={"topbar "+classHide}>topbar</div>; 
    } 
} 
8

è possibile utilizzare un componente come react-headroom per fare il lavoro pesante per voi. Oppure puoi ancora utilizzare i waypoint in React, configurandolo nello componentDidMountlifecycle method e rimuovendolo usando componentWillUnmount.

0

Ho creato un componente di reazione per questo stesso esatto bisogno in quanto non sono riuscito a trovare altre implementazioni che corrispondessero a ciò di cui avevo bisogno. Anche react-headroom non ti ha dato qualcosa che si sarebbe semplicemente spostato dopo aver raggiunto un certo punto della pagina.

il succo è qui: https://gist.github.com/brthornbury/27531e4616b68131e512fc622a61baba

Non vedo alcuna ragione per copiare il codice del componente qui. Il codice è in gran parte basato sul codice react-headroom ma fa meno ed è quindi più semplice.

Il componente è il primo pezzo di codice, è sufficiente copiare/incollare e quindi importarlo. Dopo aver importato il tuo codice con la barra di navigazione sarebbe simile a questo:

class MyScrollInNavBar extends Component { 
    render() { 
     return (
     <ScrollInNav scrollInHeight={150}> 
      <MyNavBar /> 
     </ScrollInNav> 
    ); 
    } 
} 
Problemi correlati