目前正在尝试学习与firebase的反应并继续遇到一些小障碍。
截至目前,我正在尝试从新页面中的所选项目中呈现数据。索引页面包含以下内容:
renderPosts(){
return Object.keys(this.state.posts).map((post, index)=>(
<div key={index} className="thumbnail">
<h2>
<Link to={`/view/posts/${post}`}>
{this.state.posts[post].title}
</Link>
</h2>
<p>{this.state.posts[post].body}</p>
</div>
));
}
render() {
return (
<div>
<div>
{this.renderPosts()}
</div>
<View/>
</div>
)
}
正如您所看到的,它会将该帖子的ID附加到链接中,因此我现在要做的是返回到firebase并在新页面中单独呈现具有该ID的项目的相应数据。
ViewPost.js文件如下:
constructor(props){
super(props);
this.state = {
title: '',
body: '',
};
}
componentDidMount(){
database.on('value', snapshot => {
this.setState({
post: snapshot.val()
});
this.props.match.params.postId;
});
}
render() {
return (
<div >
{this.state.props.title}
</div>
)
}
你能告诉我我做错了什么以及怎么做?
答案 0 :(得分:1)
你的例子中有一个丢失的部分,你的路由器。首先,您需要向路由器添加新路由。
<Route path='/view/posts/:postId' component={ViewPost}/>
这是您在您创建的渲染方法中的链接标记中告诉路由器的路线:
<Link to={`/view/posts/${post}`}>
我假设您在转到该链接时要呈现的组件是您在上面的ViewPost.js示例中编写的代码。如果您在路由器文件中将此组件导入ViewPost
,它现在应该可以正常工作。
单击该链接,它将加载该组件。
接下来,在组件内部,您希望调用与您在URL中看到的密钥关联的数据。从您使用的网址this.props.match.params.postId
中获取键值。
现在您可以访问键值,您可以在componentDidMount中执行常规的firebase调用:
componentDidMount(){
database
.ref(`posts/${this.props.match.params.postId}`)
.on('value', snap => {
this.setState({post: snapshot.val()});
})
}
我希望这是有道理的。首先创建一个路由,然后从URL获取密钥的值,然后使用密钥值在您最终到达的组件内执行数据库请求。