ReactJS 反应路由器 RoutingContext

Posted

技术标签:

【中文标题】ReactJS 反应路由器 RoutingContext【英文标题】:ReactJS react-router RoutingContext 【发布时间】:2016-04-18 12:00:10 【问题描述】:

我正在使用带有 react-router 模块的 ReactJS 构建同构应用程序,用于在服务器端进行路由。

来自 guide 关于在服务器上使用 react-router:

(req, res) =>       
  match( routes, location: req.url , (error, redirectLocation, renderProps) => 
    //...

    else if (renderProps) 
      res.status(200).send(renderToString(<RoutingContext ...renderProps />))
     

    //...
  )

几乎没有关于这个 RoutingContext 的信息。所以我有点不清楚它是如何工作的。它是否可以替代 react-router 中的 Router 组件(用于其他路由之上)?

任何理解帮助将不胜感激!

【问题讨论】:

【参考方案1】:

RoutingContext 是一个未记录的功能,在 v2.0.0 中将被 RouterContext 取代。它的作用是同步渲染路由组件。

它只是你的组件的一个包装器,它注入诸如historylocationparams 之类的上下文属性。

【讨论】:

我从这里github.com/rackt/react-router/blob/latest/docs/guides/advanced/… 拿走了它。开始使用 2.0.0-rc4 还是暂时使用 1.0.3 是否有意义? 你一定要等到 2.0.0【参考方案2】:

反应路由器 v4

在新版本 (v4) 中已更新为 createServerRenderContext。这与以前的工作方式非常不同,但更简洁,因为它也摆脱了使用“匹配”的需要。

此代码示例将用作快速中间件:

import React from 'react';
import  renderToString  from 'react-dom/server';
import  ServerRouter/* , createServerRenderContext */  from 'react-router';
// todo : remove line when this PR is live
// https://github.com/ReactTraining/react-router/pull/3820
import createServerRenderContext from 'react-router/createServerRenderContext';
import  makeRoutes  from '../../app/routes';

const createMarkup = (req, context) => renderToString(
  <ServerRouter location=req.url context=context >
    makeRoutes()
  </ServerRouter>
);

const setRouterContext = (req, res, next) => 
  const context = createServerRenderContext();
  const markup = createMarkup(req, context);
  const result = context.getResult();
  if (result.redirect) 
    res.redirect(301, result.redirect.pathname + result.redirect.search);
   else 
    res.status(result.missed ? 404 : 200);
    res.routerContext = (result.missed) ? createMarkup(req, context) : markup;
    next();
  
;

export default setRouterContext;

react-lego 是一个示例应用程序,展示了如何使用 createServerRenderContext 进行通用渲染

【讨论】:

看来 createServerRenderContext 实际上已经被删除了,你现在只传递一个普通的对象。 github.com/ReactTraining/react-router/issues/4471【参考方案3】:

反应路由器 v4

在新版本 (v4) 中已将其删除为 createServerRenderContext。这与以前的工作方式非常不同,但更加简洁。

这个小代码示例将被应用。

import  StaticRouter  from'react-router-dom'

const context = 

const mockup = renderToString(
  <Provider store = store>
     <IntlProvider locale = locale messages = messages[locale]>
      <StaticRouter location=request.url context=context>
        <ModuleReactWithPages />
      </StaticRouter>
     </IntlProvider>
    </Provider>
)

当它是 404 时,它本身就是一层

【讨论】:

以上是关于ReactJS 反应路由器 RoutingContext的主要内容,如果未能解决你的问题,请参考以下文章

在 reactJS 中从反应路由器链接传递道具

如何使用反应路由器生成站点地图

在 ReactJS 中更改其他路由上的导航栏背景颜色

Lumen + ReactJS 路由。分配路径

ReactJS - 使用查询参数获取路由

如何为登录页面添加 reactjs 路由器