2015-09-04 70 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>; 
 
    } 
 

 
});

相关问题