如何渲染选定对象的数据?

IT技术 javascript reactjs firebase react-router
2021-05-08 01:50:16

目前正在尝试学习与 firebase 的react,并不断遇到一些小障碍。

截至目前,我正在尝试在新页面中呈现来自选定项目的数据。索引页包含以下内容:

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个回答

您的示例中缺少一个部分,即您的路由器。首先,您需要向路由器添加一条新路由。

 <Route path='/view/posts/:postId' component={ViewPost}/>

这是您在创建的渲染方法中的链接标签中告诉路由器您想要去的路由:

<Link to={`/view/posts/${post}`}>

我假设您转到该链接时要呈现的组件是您在上面的 ViewPost.js 示例中编写的代码。如果您像ViewPost在路由器文件中一样导入此组件,它现在应该可以工作了。

单击该链接,它将加载该组件。

接下来,在组件内部,您要调用与您在 URL 中看到的键关联的数据。从您使用的 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 获取键的值,然后使用键值在最终到达的组件内执行数据库请求。