2

我试图让 Koa 同构渲染它从 react-router 接收到的 html 字符串。

这是我一直在努力工作的代码:

服务器.js

import koa from 'koa';
import React from "react";
import Router from "react-router";
import routes from "./routes";
const server = koa();
const port = process.env.NODE_ENV || 8000;

server.use(function *() {
    try {
        yield Router.run(routes, this.request.url, function (Handler) {
            var content = React.renderToString(<Handler/>)
            this.body = content
        })
    }
    catch (err) {
        this.status = err.status || 500;
        this.body = err.message;
        this.app.emit('error', err, this);
    }
 })

server.listen(port, function(err) {
  if (err) throw err;
  console.log("Server running on: http://localhost:"+port)
})

路由.js

import React from "react"
import {Route, DefaultRoute} from "react-router"
import Main from "./components/main"


export default (
  <Route path="/">
    <DefaultRoute handler={Main} name="main" />
  </Route>
)

main.js

import React from "react"

const Main = React.createFactory(React.createClass ({
  render () {
    return (
      <div>HELLO</div>
    )
  }
}))

export default Main

出现几个错误:

警告:Component(...):render在返回的组件实例上找不到方法:您可能忘记render在组件中定义,或者您可能不小心尝试渲染类型不是 React 组件的函数的元素。

警告:不要设置 React 元素的 props 属性。相反,在最初创建元素时指定正确的值。

TypeError:无法添加属性上下文,对象不可扩展

警告:有些东西直接调用了 React 组件。请改用工厂或 JSX。见:https ://fb.me/react-legacyfactory

4

2 回答 2

3

对于那些需要答案的人,希望这对你们有帮助。

服务器.js

import koa from 'koa';
import React from "react";
import Router from "react-router";
import routes from "./routes";
const server = koa();

let handler;

server.use(function *(next) {
  Router.run(routes, this.request.url, (Handler) => {
    handler = React.renderToString(<Handler/>);
  });
  yield next;
});

server.use(function *() {
  this.body = handler;
});

export default server;

组件/index.js

import React from "react";

const Main = React.createClass ({
  render () {
    return (
      <div>HELLO</div>
    );
  }
});

export default Main;

我认为没有必要为此创建工厂。

于 2015-07-07T08:48:56.443 回答
0

我也收到了“直接调用 React 组件”的警告,并通过产生一个承诺来修复它

function *() {
    this.body = yield new Promise(resolve => {
        Router.run(routes, this.req.url, Handler => {
            resolve(React.renderToString(<Handler/>));
        });
    });
}
于 2015-07-07T01:38:11.370 回答