在React组件中使用链接在服务器上呈现
问题描述:
我正在使用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;
答
有没有可能,是的。只要你有一个客户端路由器启动后,从服务器呈现页面。基本上,如果服务器上唯一的路由器,那么它将始终处理请求。但是,如果您也有一个客户端加载到客户端,那么它将接收客户端转换,并且只在您执行页面重新加载(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>;
}
});