ReactServer#RenderToString 无法正确呈现
ReactServer#RenderToString not rendering correctly
我正在尝试使用 Express 中的 React 组件完成服务器端渲染并使用 Jade 进行模板化。但是我 运行 遇到了一些问题。
这是我的服务器代码,入口点。
var app = require('express')();
var http = require('http').Server(app);
var React = require('react');
var ReactDOMServer = require('react-dom/server');
//Component
var Index = require('./views/components/index.jsx').default;
app.set('port', process.env.PORT || 3000);
app.set('views', `${__dirname}/views`);
app.set('view engine', 'jade');
app.get('/', (req, res) => {
var reactHTML = ReactDOMServer.renderToString(<Index/>);
res.render('test', { reactHTML: reactHTML });
});
http.listen(3000, () => {
console.log(`listening on port ${app.get('port')}`);
});
这是我的 Index
组件,它实际上只是用我的 ChatTextBox
组件渲染一个 div,它是这样的:
import React, { Component } from 'React';
class ChatTextBox extends Component {
constructor(props) {
super(props);
this.state = { term: 'test' };
this.termChange = this.termChange.bind(this);
this.handleClick = this.handleClick.bind(this);
}
handleClick(event) {
console.log('this was clicked');
this.setState({ term: '' });
}
termChange(event) {
console.log(event.target.value);
this.setState({ term: event.target.value });
}
render() {
return (
<div>
<input type="text"
value={this.state.term}
onChange={this.termChange} />
<button onClick={this.handleClick}>Send Message</button>
<div>{this.state.term}</div>
</div>
);
}
}
export default ChatTextBox;
编辑:
这是我的玉模板,test.jade
html
body
div#container
#{reactHTML}
问题:
1)它没有正确渲染。这是结果:
它渲染组件两次,连同“<”、“>”符号..?
2) None 的挂钩在绑定状态和动态呈现方面有效。不过这是有道理的,我在 jade 中渲染静态 HTML。那么我将如何动态地完成这个呢? (我觉得有点跑题了,可以单独关注一下)
感谢您的阅读,希望这篇 post 已经足够清楚了。
您似乎在重复使用 Jade。 reactDOM 服务器端的常用方法是将 renderToString()
的结果发送到客户端。如果你 出于任何原因需要继续使用 Jade,你可以告诉它用 !=
取消转义 HTML 字符串。因此,您可以将模板更改为:
html
body
div#container
#{!=reactHTML}
这应该确保它不会双重渲染所有内容
我正在尝试使用 Express 中的 React 组件完成服务器端渲染并使用 Jade 进行模板化。但是我 运行 遇到了一些问题。
这是我的服务器代码,入口点。
var app = require('express')();
var http = require('http').Server(app);
var React = require('react');
var ReactDOMServer = require('react-dom/server');
//Component
var Index = require('./views/components/index.jsx').default;
app.set('port', process.env.PORT || 3000);
app.set('views', `${__dirname}/views`);
app.set('view engine', 'jade');
app.get('/', (req, res) => {
var reactHTML = ReactDOMServer.renderToString(<Index/>);
res.render('test', { reactHTML: reactHTML });
});
http.listen(3000, () => {
console.log(`listening on port ${app.get('port')}`);
});
这是我的 Index
组件,它实际上只是用我的 ChatTextBox
组件渲染一个 div,它是这样的:
import React, { Component } from 'React';
class ChatTextBox extends Component {
constructor(props) {
super(props);
this.state = { term: 'test' };
this.termChange = this.termChange.bind(this);
this.handleClick = this.handleClick.bind(this);
}
handleClick(event) {
console.log('this was clicked');
this.setState({ term: '' });
}
termChange(event) {
console.log(event.target.value);
this.setState({ term: event.target.value });
}
render() {
return (
<div>
<input type="text"
value={this.state.term}
onChange={this.termChange} />
<button onClick={this.handleClick}>Send Message</button>
<div>{this.state.term}</div>
</div>
);
}
}
export default ChatTextBox;
编辑:
这是我的玉模板,test.jade
html
body
div#container
#{reactHTML}
问题:
1)它没有正确渲染。这是结果:
它渲染组件两次,连同“<”、“>”符号..?
2) None 的挂钩在绑定状态和动态呈现方面有效。不过这是有道理的,我在 jade 中渲染静态 HTML。那么我将如何动态地完成这个呢? (我觉得有点跑题了,可以单独关注一下)
感谢您的阅读,希望这篇 post 已经足够清楚了。
您似乎在重复使用 Jade。 reactDOM 服务器端的常用方法是将 renderToString()
的结果发送到客户端。如果你 出于任何原因需要继续使用 Jade,你可以告诉它用 !=
取消转义 HTML 字符串。因此,您可以将模板更改为:
html
body
div#container
#{!=reactHTML}
这应该确保它不会双重渲染所有内容