2015-10-30 11 views
6

React-Routerコンポーネントに関しては、私はダフィーです。しかし、私はリンクを歩いているときに私のコンポーネントがアンマウントする理由についての説明を見つけることができませんでしたか?それを防ぐ方法は?私はエラーだReact-routerでコンポーネントをアンマウントするのを防ぐ

によってタイマーを含むコンポーネントと再レンダリングコンテンツ持って私の例では

:ここ

enter image description here

は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

styleプロパティを処理することを忘れないでください、あなたはタイマーをしたいですかあなたのアプリ全体を通してアクティブになる?なぜあなたはそれのための特定のルートを持っていますか? – deowk

+0

これは単なる例です。私の主な目的は、リンクをナビゲートする際にコンポーネントをアンマウントしないことです。実際のプロジェクトでは、巨大なグリッドを持つ複雑なコンポーネントがあります。だから私はこのコンポーネントに戻るたびに、データを取得するためにサーバーに要求を送信します。しかし、私はそのような行動は必要ありません。なぜReact-Routerはコンポーネントを隠すのではなく、コンポーネントを破壊するのか理解できません。 – AlexeiBerkov

+0

react-routerはこの場合予想どおりに動作しています。アンマウントしないコンポーネントがある場合は、トップレベルのアプリケーションコンポーネントに組み込む必要があります。下の答えを参照してください。 – deowk

答えて

1

あなたのケースでは、反応ルータが期待どおりに動作している場合、あなたのアプリケーション全体にタイマーが表示されるようにするには、そして、ではないビュー

/*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

しかし、この場合タイマーは常に表示されます。実際のプロジェクトで前に述べたように、私は巨大なグリッドを持つ複雑なコンポーネントを持っています。だから私はこのコンポーネントに戻るたびに、データを取得するためにサーバーに要求を送信します。しかし、私はそのような行動は必要ありません。なぜReact-Routerはコンポーネントを隠すのではなく、コンポーネントを破壊するのか理解できません。私は反応ルータを使用する目的を理解していないようです:( – AlexeiBerkov

+0

@AlexeiBerkovあなたはこれのための解決策を今までに見つけましたか? – Rijk

+0

私はシンプルなCSS aproache – AlexeiBerkov

3

あなたがアンマウントせずに再構成要素を示したい場合は、常にそれを表示することができますし、ルートが離れるときに非表示にします。代わりにcomponent={ProjectsList}は、このようなプロキシコンポーネントをApp

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

1. ProjectsListと作成:

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

なります は、たとえば、あなたがのアンマウントからProjectsListを防ぐたい、この場所あなたの有能な外部の目標経路を達成するためにso:

<Route path="/(mobile.html)" component={App}> 
     <IndexRoute component={LayoutToogler} showProjects={true}/> 
  1. トップレベルのアプリケーションコンポーネントで

    はちょうどショーのプロジェクトを決定するかしない(showProjects)このプロパティを確認します

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

はあなたProjectListコンポーネント

関連する問題