【发布时间】:2015-06-24 17:06:28
【问题描述】:
我试图让 React 先在服务器上渲染一个组件,然后在客户端用一个按钮改变状态。我已经按照几个教程将组件放在服务器和客户端上的同一节点中,并使用相同的道具来做这样的事情。但是,我仍然收到无效的校验和错误消息,并且尝试单击该按钮会导致浏览器崩溃。有什么想法我哪里出错了吗?
组件:
var React = require('react')
module.exports = React.createClass({
getInitialState: function() {
return { from: this.props.from }
},
handleClick: function(){
this.setState({
from: !this.state.clicked ? 'client!' : 'server!',
clicked: !this.state.clicked
});
},
render: function() {
return (
<div>
<div>
This is from the HelloWorld.jsx component's render function.
</div>
<div>
Rendered from: {this.state.from}
</div>
<input type="button" value="Click Me" onClick={this.handleClick} />
</div>
)
}})
浏览器:
var React = require('react')
var HelloWorld = require('../Components/HelloWorld')
var helloElement = React.render(
<HelloWorld from = "server!" />,
document.getElementById("reactHelloContainer"))
服务器:
var React = require('react')
, express = require('express')
, HelloWorld = require('./Components/HelloWorld')
, path = require('path')
var app = express()
app.use('/pages', express.static(path.join(__dirname, 'Pages')))
app.get('/', function (req, res) {
res.writeHead(200, {'Content-Type': 'text/html'})
var html = React.renderToString(
<html>
<head>
<title>Hello World</title>
</head>
<body>
<div id="reactHelloContainer">
<HelloWorld from="server!" />
</div>
</body>
<script src="/pages/index.js"></script>
</html>)
res.end(html)
})
我尝试在没有 Javascript 的情况下加载页面,服务器/客户端版本似乎相同,但这是消息:
警告:React 尝试在容器中重用标记,但校验和无效。这通常意味着您正在使用服务器渲染,并且在服务器上生成的标记不是客户端所期望的。 React 注入了新的标记来补偿哪些工作,但是您已经失去了服务器渲染的许多好处。相反,请弄清楚为什么在客户端或服务器上生成的标记不同:
(客户端)eactid=".1566xf5m134">
(服务器)eactid=".1566xf5m134.1.1.0">
【问题讨论】:
标签: reactjs