我是新手,我正在努力建立一些东西来学习它的概念。
我已经创建了一些反应组件但是无法弄清楚为什么在JSON请求成功完成后我的Post
组件没有被渲染。
注意:Posts
和PostList
组件正在呈现,没有任何问题。
我在这里缺少什么?
/** @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组件,但你可以认为它工作正常。
提前谢谢你:)
答案 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,你几乎肯定会有错误。