2015-10-30 8 views
6

I am duffer quando si tratta del componente React-Router. Tuttavia non sono riuscito a trovare una spiegazione del perché i miei componenti si smontano quando passo attraverso i collegamenti? E come prevenirlo?Evitare che il componente venga smontato con React-router

Nel mio esempio ho un componente che contiene timer e ri-renderizzare i contenuti di

ho ottenuto un errore:

enter image description here

Ecco il codice ReactJS:

/*global define, Backbone, React, $, Request, Router, Route, Link */ 

var App = React.createClass({ 
    render: function() { 
     return (
      <div> 
       <h1>App</h1> 
       <ul> 
        <li><Link to="/about">About</Link></li> 
        <li><Link to="/timer">Timer</Link></li> 
       </ul> 
       {this.props.children} 
      </div> 
     ) 
    } 
}); 

var About = React.createClass({ 
    render: function() { 
     return <h3>Here is about page</h3> 
    } 
}); 

var Timer = React.createClass({ 
    getInitialState: function() { 
     return {counter: 0}; 
    }, 
    render: function() { 
     return (
      <div> 
       <h2>Time is running over...</h2> 
       <b>{this.props.interval}</b> 
       <p>{this.state.counter}</p> 
      </div> 
     ) 
    }, 
    componentDidMount: function() { 
     this.loadCommentsFromServer(); 
     setInterval(this.loadCommentsFromServer, 1000); 
    }, 
    loadCommentsFromServer: function() { 
     this.setState({counter: this.state.counter + 1}); 
    } 
}); 

React.render((
    <Router location="history"> 
     <Route path="/" component={App}> 
      <Route path="about" component={About} /> 
      <Route path="timer" component={Timer} /> 
     </Route> 
    </Router> 
), document.body); 
+0

Vuoi il timer essere attivo in tutta la tua app? Perché hai un percorso specifico per questo? – deowk

+0

È solo un esempio. Il mio obiettivo principale è non smontare i componenti durante la navigazione attraverso i collegamenti. Nel mio vero progetto ho una componente complicata con un'enorme griglia. Quindi ogni volta che torno a questo componente invia una richiesta al server per ottenere i dati. Ma non ho bisogno di un simile comportamento. E non capisco perché React-Router distrugge il componente invece di nasconderlo? – AlexeiBerkov

+0

react-router si comporta come previsto in questo caso: se si dispone di un componente che non deve essere smontato, è necessario comporlo nel componente di primo livello dell'app, vedere la risposta sotto – deowk

risposta

1

nel tuo caso react-router funziona come previsto, se vuoi che il timer sia visibile in tutta la tua app allora devi trattare è un componente e non una vista

/*global define, Backbone, React, $, Request, Router, Route, Link */ 

var App = React.createClass({ 
    render: function() { 
     return (
      <div> 
       <h1>App</h1> 
       // this will not unmount when routes are changed 
       <Timer /> 
       <ul> 
        <li><Link to="/about">About</Link></li> 
       </ul> 
       // this will unmount/mount when routes are changed 
       {this.props.children} 
      </div> 
     ) 
    } 
}); 

var About = React.createClass({ 
    render: function() { 
     return <h3>Here is about page</h3> 
    } 
}); 

var Timer = React.createClass({ 
    getInitialState: function() { 
     return {counter: 0}; 
    }, 
    render: function() { 
     return (
      <div> 
       <h2>Time is running over...</h2> 
       <b>{this.props.interval}</b> 
       <p>{this.state.counter}</p> 
      </div> 
     ) 
    }, 
    componentDidMount: function() { 
     this.loadCommentsFromServer(); 
     setInterval(this.loadCommentsFromServer, 1000); 
    }, 
    loadCommentsFromServer: function() { 
     this.setState({counter: this.state.counter + 1}); 
    } 
}); 

React.render((
    <Router location="history"> 
     <Route path="/" component={App}> 
      <Route path="about" component={About} /> 
     </Route> 
    </Router> 
), document.body); 
+3

ma in questo caso il timer sarà sempre visibile. Come ho già detto nel mio vero progetto, ho una componente complicata con una grande griglia. Quindi ogni volta che torno a questo componente invia una richiesta al server per ottenere i dati. Ma non ho bisogno di un simile comportamento. E non capisco perché React-Router distrugge il componente invece di nasconderlo? Sembra che non capisco lo scopo di utilizzare react-router :( – AlexeiBerkov

+0

@AlexeiBerkov hai mai trovato una soluzione per questo? – Rijk

+0

Io uso semplice aproache CSS – AlexeiBerkov

3

Se si desidera visualizzare nuovamente il componente senza smontaggio, è possibile mostrarlo sempre e nasconderlo quando i percorsi escono. Per raggiungere questo luogo si competente percorso di destinazione al di fuori, per esempio, si desidera evitare che ProjectsList da Smonta:

<Route path="/" component={App}> 
     <IndexRoute component={ProjectsList} /> 
     ..... 

1. Posizionare ProjectsList in App e creare tale componente proxy invece component={ProjectsList}:

const LayoutToogler =() => (<div></div>); 

guarderà così:

<Route path="/(mobile.html)" component={App}> 
     <IndexRoute component={LayoutToogler} showProjects={true}/> 
  1. In cima componente App livello Basta controllare questa struttura (showProjects) per decidere mostrare progetti o non:

     <ProjectsList 
         style={{display:this.props.children.props.route.showProjects?'block':'none'}} 
           /> 
    

Non dimenticare di gestire style proprietà nel componente ProjectList