我试图在我的项目中实现react-router并遇到巨大的概念误解。对于我的应用程序中的一些组件,我需要从服务器获取数据。以前我用这段代码做了:
$.get('/getSmData', options, function (result) {
// set state with result or whatever
}.bind(this));
放在componentDidMount或onClick函数中,但现在,为了进行服务器路由,所有请求都转到我的路由文件。
如何获取数据?
var renderToString = require( 'react-dom/server').renderToString
var match = require('react-router').match
var RouterContext = require('react-router').RouterContext
var routes = require('./routes')
app.get('*', function (req, res) {
match({ routes, location: req.url }, (error, redirectLocation, renderProps) => {
if (error) {
res.status(500).send(error.message)
} else if (redirectLocation) {
res.redirect(302, redirectLocation.pathname + redirectLocation.search)
} else if (renderProps) {
res.render('index', {
react: renderToString(React.createElement(RouterContext, renderProps)),
})
} else {
res.status(404).send('Not found')
}
})
})
module.exports= (
<Router history={browserHistory}>
<Route path='/' component={index.App}>
<Route path='/firstPage' component={First}>
<Route path=':firstPageChild' component={FirstCh}/>
</Route>
</Route>
<Route path='/secondPage' component={Second}/>
</Route>
</Router>
);
让我们说我需要在onButtonClick函数中获取firstPageChild子节点的子节点中的一些数据。我无法预呈现数据并使用标记发送,那么我该怎么办呢?
答案 0 :(得分:2)
我相信你找到了答案。但请让我回答,以防有人遇到同样的问题(就像我今天早上做的那样)。
所以你的代码将是这样的:
app.get('*', function (req, res, next) {
match({ routes, location: req.url }, (error, redirectLocation, renderProps) => {
if (error) {
res.status(500).send(error.message)
} else if (redirectLocation) {
res.redirect(302, redirectLocation.pathname + redirectLocation.search)
} else if (renderProps) {
res.render('index', {react: renderToString(React.createElement(RouterContext, renderProps)),
})
} else {
// release control to the next middleware, in this case your URL for catching AJAX data
next();
}
})
})
// return your AJAX data
app.get('/getSmData', function (req, res) {
res.send({ status: 'ok' });
});
// return 404 not found error
app.use(function (req, res) {
res.status(404).send('Not found');
});
答案 1 :(得分:0)
似乎我已经明白了。显然,如果app.get(&#39; *&#39;)支持其他请求,它将只捕获其他请求,这完全有意义。