服务器端 react-router 不会渲染我的路由

Posted

技术标签:

【中文标题】服务器端 react-router 不会渲染我的路由【英文标题】:Server side react-router won't render my routes 【发布时间】:2015-12-23 17:17:27 【问题描述】:

我使用的是 1.0.0-rc1 版本,我的匹配函数无法正确呈现我的路线。

这是我的服务器

import express from 'express';
import React from 'react';
import createLocation from 'history/lib/createLocation'
import Router,  match, RoutingContext  from 'react-router';
import createRoutes from './create-routes';

const app = express();
const routes = createRoutes();

app.use((req, res) => 
  let location = createLocation(req.url);

  match( routes, location , (error, redirectLocation, renderProps) => 
    if (redirectLocation)
      res.status(301).redirect(redirectLocation.pathname + redirectLocation.search)
    else if (error)
      res.status(500).send(error.message)
    else if (renderProps == null)
      res.status(404).send('Not found')
    else
      res.send(React.renderToString(<RoutingContext ...renderProps/>))
  );
);

export default app;

这是我的路线

import React from 'react';
import  Route  from 'react-router';
import Application from './components/Application.react';
import Home from './components/Home.react';

export default function() 
  return (
    <Route path="/" component=Application>
      <Route path="home" component=Home />
    </Route>
  );

我在这方面做错了什么?当我请求 /home 时,它​​应该呈现 &lt;h1&gt;Home&lt;/h1&gt; 而不是 &lt;h1&gt;Application&lt;/h1&gt;。就这么简单。

我基于这个https://github.com/rackt/react-router/blob/master/docs/guides/advanced/ServerRendering.md

谢谢

【问题讨论】:

【参考方案1】:

您正在使用子路由。这意味着,当您转到“/home”时,首先呈现应用程序,然后子 Home 被注入并通过应用程序组件内部的this.props.children 可用。 一个简单的例子见here:

试试这个(不是嵌套的):

<Route path="/" component=Application>
<Route path="/home" component=Home />

如果您想在 Home 组件周围呈现您的应用程序组件,请使用

render() 
    return (
        <div>
            <h1>Application</h1>
             this.props.children 
        </div>
    );

【讨论】:

在 :) 中编辑了 Application 组件的渲染 查看问题,你将如何渲染 childRoutes 然后服务器端?

以上是关于服务器端 react-router 不会渲染我的路由的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React-Router 的服务器端渲染中的 <Link> 标签更改 StaticRouter 的位置道具

使用 react-router v4 和 express.js 进行服务器渲染

使用 redux 和 react 进行异步服务器端渲染

使用 webpack 和 react-router 进行延迟加载和代码拆分不加载

使用 React Router 进行服务器端渲染“浏览器历史记录需要一个 DOM”

react-router