我有3个反应组件 - 一个容器(SearchBarContainer)和2个表示组件(PostList& PostItem(PostList的子组件))
我正在尝试将一个点击处理程序附加到post项目,该项目将冒泡到SearchBarContainer,这是我的代码:
class SearchBarContainer extends Component {
selectPost(post) {
console.log('cliked');
//this.props.dispatch(selectPost(post));
}
render() {
return (
<div>
<div className="center-xs">
<p>To get started, type in some keywords below</p>
</div>
<SearchBar onTermChange={this.props.actions.loadPosts} onNull={this.props.actions.nullPosts}/>
<PostList posts={this.props.posts} isFetching={this.props.isFetching} onClick={this.selectPost}/>
</div>
);
}
}
这是我的postList:
const PostList = (props) => {
const postItems = props.posts.map((singlePost) => {
return <PostItem key={singlePost.id} post={singlePost} onClick={() => props.onClick}/>
});
if(!props.isFetching) {
return (
<div className="mt2 row list-unstyled" > {postItems}</div>
);
} else {
return (
<Loader />
);
}
};
export default PostList;
但是这个点击处理程序不起作用。我注意到如果我将click处理程序放在包装postItems数组的div上然后它确实有效,我认为问题是click处理程序附加到一个包含在div中的映射项?
这是PostItem函数:
const PostItem = (singlePost) => {
return (
<div className="col-lg-4 col-md-12 mb2 animated fadeIn">
<div className="card rounded">
<div className="card-header p1">
<h4 className="card-title mt0 h5">{singlePost.post.title}</h4>
</div>
<img className="card-img-top img-fluid" src={singlePost.post.thumbnail} alt={singlePost.post.title} />
<div className="card-block p1">
{/*<p className="card-text">{singlePost.post.description}</p>*/}
<Link to={`/product/${singlePost.post.slug}`} className="btn btn--blue flt--left w100">View More</Link>
</div>
</div>
</div>
)
};
export default PostItem;
我想也许我需要点击处理程序事件,如下所示: 点击(PostItem) - &gt;传递道具(PostList) - &gt;传递道具(SearchBarContainer)
答案 0 :(得分:1)
因为您正在使用带有onClick的箭头功能而不是在其身体中调用props.onClick
函数:
onClick={() => props.onClick}
使用此放置()
:
onClick={() => props.onClick()}
或者不使用箭头功能直接写:
onClick = {props.onClick}
<强>更新强>
无论我们传递什么道具,它都将成为对象属性值,我们需要在子组件中使用它。
您正在PostItem
传递onClick函数,但在PostItem
内部您没有在任何地方使用它,在任何DOM节点上定义click事件,如下所示:
<div onClick={singlePost.onClick} ....>
答案 1 :(得分:1)
我认为你已经将onClick传递给了组件PostItem:
return <PostItem key={singlePost.id} post={singlePost} onClick={() => props.onClick}/>
你应该将它作为prop传递给PostItem组件并在那里处理它。就像你传递的关键和帖子一样。也可以用于onClick,例如:
return <PostItem key={singlePost.id} post={singlePost} onClick={props.onClick}/>
并在PostItem组件中处理onClick prop。