【发布时间】:2014-11-26 20:17:34
【问题描述】:
我在服务器端渲染所有内容时遇到问题,并且触发了句柄提交。以下是源代码:
index.js:
module.exports = require('./app/server');
应用程序/服务器/index.js:
'use strict';
var env = process.env.NODE_ENV || 'development';
var express = require('express');
var http = require('http');
var app = express();
app.set('state', {});
// Inject Config
require('../config/server')[env](app, express);
// Inject component rendering
require('node-jsx').install({extension: '.jsx'});
app.use(require('../../lib/renderReactComponent')(app));
// Start server
var server = http.createServer(app);
return server.listen(app.get('port'), function() {
return console.log('Listening on port ' + app.get('port') + ', Env: ' + app.settings.env);
});
module.exports = app;
lib/renderReactComponent.js:
var ReactApp = require('../app');
var React = require('react');
var path = require('path');
var url = require('url');
module.exports = function(app) {
return function(req, res, next) {
try {
var path = url.parse(req.url).pathname;
res.send(React.renderComponentToStaticMarkup(ReactApp({path: path, state: app.get('state')})));
} catch(err) {
return next(err)
}
}
}
app/index.js:
var ReactApp = require('./components/app');
module.exports = ReactApp;
app/components/app.js:
/**
* @jsx React.DOM
*/
var React = require('react');
var ReactRouter = require('react-router-component');
var App = React.createClass({
propTypes: {state: React.PropTypes.object.isRequired},
getInitialState: function() {
return {items: [], text: ''};
},
handleSubmit: function () {
console.log("handleSubmit triggered!");
var $author = this.refs.author.getDOMNode(),
$text = this.refs.text.getDOMNode(),
author = $author.value.trim(),
text = $text.value.trim();
if(!author || !text) {
return false;
}
if(this.props.onCommentSubmit) {
this.props.onCommentSubmit({ author: author, text: text });
}
$author.value = '';
$text.value = '';
return false;
},
render: function() {
return (
<html>
<form className="commentForm" onSubmit={this.handleSubmit}>
<input type="text" ref="author" placeholder="Your name"/>
<input type="text" ref="text" placeholder="Say Something ..."/>
<input type="submit" value="Post"/>
</form>
</html>
);
}
});
module.exports = App;
这段代码没有给我错误,但是没有触发handleSubmit。我认为这是因为它不是由服务器端呈现的。尝试从服务器端呈现页面时如何触发表单事件 handleSubmit ?
【问题讨论】:
-
你不能。这不是在服务器上渲染 React 的重点。
onSubmit等是客户端事件,所以在那里处理它们 -
我同意,但是在从服务器端呈现客户端页面时如何处理 onSubmit 等...?
-
您是否在某处渲染组件?您的 app/index.js 包含应用但不呈现它。你需要一个
React.renderComponent(ReactApp(), document.getElementById("wheres-your-container"))和一个真实的 DOM 元素,组件渲染到该元素中。 -
从代码中可以看到,我只在renderReactComponent.js中调用了renderComponentToStaticMarkup。所以一切都在服务器端渲染并发送到客户端。
标签: javascript node.js express reactjs