【问题标题】:Passing props to the handler of React router in the server将 props 传递给服务器中 React 路由器的处理程序
【发布时间】:2015-11-19 10:32:05
【问题描述】:

我正在关注 react-router 指南中报告的示例

var App = React.createClass({
  render: function () {
    return <div>Hi</div>;
  }
});

var routes = (
  <Route handler={App} path="/" />
);

// if using express it might look like this
app.use(function (req, res) {
  // pass in `req.url` and the router will immediately match
  Router.run(routes, req.url, function (Handler) {
    var content = React.renderToString(<Handler/>);
    res.render('main', {content: content});
  });
});

很简单,不是吗?相反,这是我的代码:

export function index(req: express.Request, res: express.Response, next: Function) {
    Router.run(routes, req.url, (Handler, state) => {
        fs.readFileAsync(
            path.join(__dirname, '..', 'mockData/airport-codes.csv'),
            'utf-8'
        ).then((content) => {
            return csv.parseAsync(content);
        }).then((parsedContent: Array<string[]>[]) => {
            ResponseHelper.renderTemplate('index', res, {
                output: React.renderToString(React.createElement(Handler, {
                    header: [
                        "ID", "Type", "Name", "Latitude (deg)", "Longitude (deg)", "Elevation", "Continent", "Country ISO", "Region ISO", "Municipality", "GPS Code", "IATA Code", "Local Code"
                    ],
                    initialData: parsedContent
                }))
            });
        }).catch(next);
    });
}

基本上我所做的是获取数据并传递给 Handler 以初始化组件。这是 react 中的文件路径:

import { Route } from "react-router";
import * as React from "react";

import Excel from "../components/Excel";

export default (
  <Route handler={Excel} path="/" name="excel" />
);

这是前端的入口点

import * as React from "react";
import * as Router from "react-router";

import routes from "./shared/routes";

Router.run(routes, Router.HistoryLocation, (Root, state) => {
  React.render(<Root />, document.getElementById('app'));
});

我的问题是,当我启动应用程序时,我收到以下警告:

Warning: Failed propType: Required prop `header` was not specified in `Excel`. Check the render method of `Router`.
Warning: Failed propType: Required prop `initialData` was not specified in `Excel`. Check the render method of `Router`.

因此出现错误。你知道在这种情况下哪种方式传递 props 是正确的吗?

编辑

错误信息

Uncaught SyntaxError: Unexpected token &
1../components/Excel @ bundle.js:4s @ bundle.js:1e @ bundle.js:1(anonymous function) @ bundle.js:1

【问题讨论】:

  • 我修复了服务器中的错误,现在它可以从服务器正确呈现,但不能在客户端呈现。似乎服务器中的渲染工作正常,但在客户端却没有

标签: javascript node.js typescript reactjs react-router


【解决方案1】:

像你这样的同构应用程序的生命周期是首先,服务器运行 JS 代码并返回呈现结果的 HTML 字符串表达式。它将它挂载到 DOM,然后在上面加载你的前端应用程序。当然 DOM 应该是相同的,所以它不需要真正重新渲染任何东西,但它确实将所有 JS 事件处理程序、React 代码等安装到窗口。

它仍然会处理Router.run 方法并匹配路由,但它将是从服务器加载的同一个页面。然而,在那之后,前端必须复制服务器端功能(即获取数据,传递给路由组件)。

因此,在您的前端代码中,您需要获取通常在服务器上执行的所需数据,并将其作为道具传递给&lt;Root /&gt; 组件。

查看这个演示,特别是app/server.js(服务器端渲染)和app/client.js(客户端渲染)。希望这会有所帮助!

React Router Mega Demo

【讨论】:

  • 我已经对我的代码进行了一些更改,现在警告和错误不再出现,但现在我收到错误 Uncaught SyntaxError: Unexpected token & the server is rendering correct
  • 你可以在这里查看完整代码github.com/mazzy89/expressjs-typescript
  • 我收到“找不到模块 '../server' 错误。我是否遗漏了什么?或者您可以粘贴您收到的完整错误消息吗?
  • 您是否使用了转译器 typescript?js 文件不包括在内
  • 哦不,对不起。我现在没有带宽来设置它,你能发布错误消息吗?
猜你喜欢
  • 1970-01-01
  • 2017-08-19
  • 2015-10-30
  • 2020-04-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
  • 2017-10-14
  • 1970-01-01
相关资源
最近更新 更多