我正在使用节点js来渲染我的反应组件......
var express = require('express');
var router = express.Router();
var React = require('react');
var reactDom = require('react-dom/server');
var App = React.createFactory(require('../components/index'));
router.get('/', function(req,res) {
var reactHtml = reactDom.renderToString(App({exists: false}));
res.render('../../tutorHub/views/index.jade', {reactOutput: reactHtml});
});
module.exports = router;
我正在尝试将道具exists: false
传递给组件。
但是当我尝试console.log
时,在我的实际组件中......
render(){
console.log(this.props.exists);
return (
<Register />
);
}
我得到undefined
而不是true
。
我该如何解决这个问题?这是因为浏览器正在重新渲染页面吗?
答案 0 :(得分:3)
原因是在您的客户端,React将再次呈现您的App
组件。这次,React将重新呈现哪些组件与服务器呈现的组件不同。它会刷新您的props.exists
到undefined
,因为您没有向客户端代码中的App
组件传递任何内容。有一些技术可以解决它。一种方法是在客户端代码中,从服务器请求exists
并在呈现应用程序之前将其传递给App
组件。
答案 1 :(得分:0)
我根据您的代码创建了一个非常简单的应用,并且能够在render方法中正确设置exists
道具。鉴于这个自包含的版本有效,我想知道问题是否在../components/index
的代码中存在。
'use strict';
var express = require('express');
var router = express.Router();
var React = require('react');
var reactDom = require('react-dom/server');
var App = React.createFactory(class extends React.Component {
render () {
console.log(this.props);
return React.createElement('div');
}
});
router.get('/', function(req,res) {
var reactHtml = reactDom.renderToString(App({exists: false}));
res.send(reactHtml);
});
var app = express();
app.use('/', router);
app.listen(3000);