如何从所选对象渲染数据?

时间:2018-02-05 07:31:46

标签: javascript reactjs firebase react-router

目前正在尝试学习与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>
    )
  }

你能告诉我我做错了什么以及怎么做?

1 个答案:

答案 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获取密钥的值,然后使用密钥值在您最终到达的组件内执行数据库请求。