组件未呈现

时间:2014-06-21 14:26:13

标签: reactjs react-jsx

我是新手,我正在努力建立一些东西来学习它的概念。

我已经创建了一些反应组件但是无法弄清楚为什么在JSON请求成功完成后我的Post组件没有被渲染。

注意:PostsPostList组件正在呈现,没有任何问题。

我在这里缺少什么?

/** @jsx React.DOM */
var Posts = React.createClass({
  render: function() {
    return (
      <div className="posts">
        <h3>Featured Jobs</h3>
        <PostList />
        <p>More Awesome Jobs →</p>
      </div>
    )
  }
});

var PostList = React.createClass({
  getInitialState: function() {
    return { posts: [
    ] };
  },

  componentDidMount: function() {
    $.getJSON('/api/posts', function(results) {
      this.setState({
        posts: results
      });
    }.bind(this));
  },

  render: function() {
    var posts = this.state.posts.map(function(post) {
      return <PostListItem post={post} />;
    });

    return <ul className='post-list'>{posts}</ul>;
  }
});

var PostListItem = React.createClass({
  handleClick: function(e) {
    var post_id = this.props.post.id;
    var path = '/api/posts/' + post_id;
    $.getJSON(path, function(post) {
      return <Post title={post.title} location={post.location} description={post.description} />;
    });
  },

  render: function() {
    return (
      <div className="post-item">
        <li key={this.props.post.id}><a href="#" onClick={this.handleClick}>{this.props.post.title}</a></li>
      </div>
    );
  }
});

var Post = React.createClass({
  render: function() {
    return(
      <div className="post">
        <h1>{this.props.title}</h1>
        <h2>{this.props.location}</h2>
        <p>{this.props.description}</p>
      </div>
      );
  }
});

ps:我通过rails helper渲染Posts组件,但你可以认为它工作正常。

提前谢谢你:)

2 个答案:

答案 0 :(得分:1)

您需要找到一种方法将数据传递给ajax回调中的Post(返回组件将不执行任何操作)。一种方法是使用setProps,例如:

$.getJSON(path, function(post) {
  Post.setProps(post);
});

请注意,这只能对根级别组件执行(如文档中所述)。也许你需要找到一种更通用的方法来处理反应数据(Backbone等)。

答案 1 :(得分:1)

强烈建议不要在组件中调用renderComponent,就像你说你在另一个答案中一样。如果我完全误解了你在做什么,请不理我。

我假设您在PostListItem中有这样的内容:

// handleClick()
$.getJSON(path, function(post) {
  React.renderComponent(Post(post), this.getDOMNode());
});

你会以这种方式混淆React,如果有更新,你就会失去那个帖子。

相反,将所有渲染保留在render函数中,并将分支逻辑放在那里。

// handleClick()
$.getJSON(path, function(post) {
  this.setState({post: post})
}.bind(this));

// render()
// probably want to have getInitialState return {post: null}
if (this.state.post) {
  return <Post data={this.state.post}/>;
} else {
  // return fallback thing
}

请记住,render应描述您的组件在任何给定时间点的样子。一旦你突破并开始修改应用程序/组件的其他部分中的DOM,你几乎肯定会有错误。