React-router服务器端呈现和ajax获取数据

时间:2016-05-16 14:24:38

标签: javascript ajax reactjs react-router

我试图在我的项目中实现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')
    }
  })
})

这是routes.js

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子节点的子节点中的一些数据。我无法预呈现数据并使用标记发送,那么我该怎么办呢?

2 个答案:

答案 0 :(得分:2)

我相信你找到了答案。但请让我回答,以防有人遇到同样的问题(就像我今天早上做的那样)。

  1. 您应该将404错误处理移出“匹配反应路由器”功能,
  2. 将第三个参数“next”添加到上面的返回函数#1,
  3. 放置代码以返回此函数下的AJAX数据。
  4. 创建一个路径来处理404未找到错误并将其放在底部。
  5. 所以你的代码将是这样的:

        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;)支持其他请求,它将只捕获其他请求,这完全有意义。