Abh*_*aha 5 node.js express reactjs react-router
我正在研究React-Express-Node应用程序并专注于SPA.我正在使用react-router.
我的server.js文件看起来像这样(只有路由部分):
app.use(function(req, res, next) {
Router.run(routes,function(Handler, state) {
var ele = React.createElement(Handler);
res.render(path.join(__dirname + '/public/index'), {html: html});
});
next();
});
Run Code Online (Sandbox Code Playgroud)
而routes文件有这个代码(粘贴主要部分):
module.exports = (
<Route name="app" path="/" handler={Main}>
<Route name="about" path="about" handler={About}/>
<Route name="about/id" path="about/:id" handler={About}/>
<DefaultRoute name="default" handler={Home} />
</Route>
);
Run Code Online (Sandbox Code Playgroud)
而client.js看起来像这样:
Router.run(routes, function(Root,state){
React.render(<Root />,document.getElementById('app'));
});
Run Code Online (Sandbox Code Playgroud)
此设置正常,没有任何问题.
现在,我想使用History API pushstate,以便我可以拥有更好的URL并摆脱#.为此,我Router.HistoryLocation在client.js中添加了第二个参数并且它可以工作,它会删除#并提供干净的URL.但是,我的页面刷新了我不想要的东西.
我已经搜索过这个并找到了几个解决方案,但他们要么使用Flux,要么使用自定义路由器.我肯定错过了一些与国家有关但却无法弄清楚的事情.有人能指出我正确的方向吗?
完全可以Router.HistoryLocation与快速服务器渲染的 SPA 应用程序一起使用(我现在正在这样做)。
您需要告诉 server.js 文件在哪里获取历史记录,即req.url......像这样。
Router.run(routes, req.url, function(Handler, state) {
var ele = React.createElement(Handler);
res.render(path.join(__dirname + '/public/index'), {html: html});
});
Run Code Online (Sandbox Code Playgroud)
如果服务器设置正确,下一个要检查的项目是如何转换到路由。使用传统的锚<a/>标记将始终刷新页面。React Router 提供了自己的<Link/>组件,允许您导航到路线而不会导致页面重新加载。您还可以考虑transitionTo()直接在路由器上调用以进行导航。
此外,当<Link/>标签处于活动状态时,它还会将活动类传递给标签,以便 css 可以相应地设置其样式。
关联
<Link to="route" props={} query={}>My Link</Link>
Run Code Online (Sandbox Code Playgroud)
导航
router.transitionTo('route', params, query);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2255 次 |
| 最近记录: |