React + Backbone,Target容器不是DOM元素

时间:2014-05-29 19:15:16

标签: javascript backbone.js reactjs

注意:这是一个抛出的反应错误。

所以我正在尝试一个实验,我根据该页面从骨干路由器渲染一个post组件。现在我知道你通常不会这样做,事情会变得混乱等等。但是再次它只是一个实验

所以我在骨干网中有以下路线(注意反应呼叫):

AisisWriter.Routers.Posts = Backbone.Router.extend({

  writer_posts: null,

  posts: null,

  mountNode: $('#blog-manage'),

  routes : {
      '': 'index'
  },

  initialize: function() {
    this.writer_posts = new AisisWriter.Collections.Posts();
  },

  index: function() {
    var options = { reset: true };
    this.writer_posts.fetch(options).then(this.postsRecieved, this.serverError);
  },

  // Deal with the posts received
  postsRecieved: function(collection, response, options) {
    this.posts = collection;

    // Walk through the posts.
    $.each(this.posts, function(key, value){
      // value is an array of objects.
      $.each(value, function(index, post_object){
        React.renderComponent(new Post({post: post_object}), this.mountNode);
      });
    });
  },

  // Deal with any server errors
  serverError: function() {
    console.log('There was an error trying to fetch the posts.');
  }

});

这个想法是它应该在页面上吐出一个帖子标题,一个接着一个(我觉得它只会做一次)。

但问题是控制台在说:

Uncaught Error: Invariant Violation: _registerComponent(...): Target container is not a DOM element.

这是因为我试图渲染组件的方式吗?

2 个答案:

答案 0 :(得分:10)

您将this.mountNode设置为$('#blog-manage'),这是一个jQuery对象(实质上是一个节点数组)。如果你做了

mountNode: $('#blog-manage')[0]

mountNode: $('#blog-manage').get(0)

然后您将引用实际的DOM节点。

答案 1 :(得分:3)

React.renderComponent将组件呈现为真正的DOM元素。抛出异常是因为您没有将DOM元素作为必需的第二个参数传递。

ReactComponent renderComponent(
  ReactComponent component,
  DOMElement container,
  [function callback]
)
     

将React组件渲染到提供的DOM中   容器并返回对组件的引用。

如果您只想要来自React的HTML,则可以改为使用React.renderComponentToStaticMarkup