2015-09-04 68 views
1

我正在使用pay pals react引擎。我有我的佈局組件調用我的導航組件。由於Nav是全球性的,我想把它放在Layout中,兩者似乎都被渲染到了服務器端。當我想在導航中使用反應路由器鏈接功能時,問題就出現了。在React組件中使用鏈接在服務器上呈現

佈局:

var React = require('react'); 

var Nav = require('../../server/components/Nav.jsx'); 

module.exports = React.createClass({ 

    componentDidMount: function(){ 
     try{Typekit.load({ async: true });}catch(e){} 
    }, 

    render: function render() { 
     return (
      <html> 
      <head> 
       <meta charSet='utf-8' /> 
       <link rel="stylesheet" type="text/css" href="/css/main.css" /> 
       <meta name="viewport" content="width=device-width, initial-scale=1" /> 
       <title> 
        {this.props.title} 
       </title> 
      </head> 
      <body> 

      { /*trying to pass router as a prop as a useless attempt to make this work*/ } 
      <Nav router={this.props.router} /> 
      <div className="wrap"> 
       {this.props.children} 
      </div> 
      </body> 
      <script src='/bundle.js'></script> 
      </html> 
     ); 
    } 
}); 

這是我的導航組件。您可以在UL標籤內看到我正在使用錨點元素。我希望使用標籤,這樣反應路由器將完成它的工作,而不必向服務器發送新的請求。我已經嘗試了一些不同的東西,但是我沒有成功。是否可以在服務器渲染的組件中使用反應路由器?

var React = require('react'); 
var Logo = require('./logo.jsx'); 

var Nav = React.createClass({ 
    render: function(){ 
     var mobileMenuShow = function(e){ 
      var el = e.currentTarget; 
      var list = document.querySelector('.main-nav-list'); 
      if(el.innerHTML === '+'){ 
       el.innerHTML = '-'; 
       list.setAttribute('class', 'main-nav-list open'); 
      } else{ 
       el.innerHTML = '+'; 
       list.setAttribute('class', 'main-nav-list'); 
      } 
     }; 
     return (
      <nav className="background-first main-nav"> 
       <section className="nav-wrap"> 
        <section className="main-nav-left"> 
         <div className="main-nav-logo"><Logo /></div> 
         <div className="plus-icon" onClick={mobileMenuShow}>+</div> 
        </section> 
        <section className="main-nav-right"> 
         <ul ref="navList" className="main-nav-list"> 
          <li><a href="/signup">Sign Up</a></li> 
          <li><a href="#">Log In</a></li> 
          <li><a href="#">Quick Start</a></li> 
          <li><a href="#">Docs</a></li> 
          <li><a href="#">About</a></li> 
         </ul> 
        </section> 
       </section> 
      </nav> 
     ) 
    } 
}); 

module.exports = Nav; 

回答

0

有沒有可能,是的。只要你有一個客戶端路由器啓動後,從服務器呈現頁面。基本上,如果服務器上唯一的路由器,那麼它將始終處理請求。但是,如果您也有一個客戶端加載到客戶端,那麼它將接收客戶端轉換,並且只在您執行頁面重新加載(F5)或輸入新URL時使用服務器。 Check out the React Router Mega Demo以查看client.js文件在從服務器加載應用程序後是如何創建路由器的。

要完成Link/<li>問題,您只需創建一個組件以返回標籤中的鏈接。

下面是如何完成此操作的示例(taken from issue 666)。

var NavTab = React.createClass({ 
 
    contextTypes: { 
 
     router: router: React.PropTypes.func 
 
    }, 
 
    render: function() { 
 
     var isActive = this.context.router.isActive(this.props.to, this.props.params, this.props.query); 
 
     var className = isActive ? 'active' : ''; 
 
     var link = (
 
      <Link {...this.props} /> 
 
     ); 
 
     return <li className={className}>{link}</li>; 
 
    } 
 

 
});

相關問題