React-Router Router.HistoryLocation刷新页面

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,要么使用自定义路由器.我肯定错过了一些与国家有关但却无法弄清楚的事情.有人能指出我正确的方向吗?

Bra*_*ugh 1

完全可以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)

查看链接文档导航文档