【问题标题】:How to Retrieve and Render Data from Firebase using ID/Key (with React)?如何使用 ID/Key(使用 React)从 Firebase 检索和呈现数据?
【发布时间】:2018-07-13 08:01:14
【问题描述】:

我正在尝试从 Firebase 服务器访问数据,然后继续打开对象的查看页面。我认为我的路由肯定是有效的。

我希望点击的帖子链接的索引组件是这样的:

renderPosts() {
  return _.map(this.state.posts, (post, key) => {
    return (
      <div key={key} className="thumbnail">
        <h2>
          <Link to="/view/posts/{post}">
            {post.title}
          </Link>
        </h2>
        <p>{post.body}</p>
      </div>
    );

  });
}

我试图链接到帖子,因为我认为它基于用于构建该功能的 componentDidMount 工作。我也将视图组件导入其中。

app.js 页面是这样的:

      <BrowserRouter>
        <div>
          <div>
            <Nav/>
          </div>
          <Switch>

            <Route path='/' exact component={List}/>
            <Route path='/new' component={NewPost}/>
            <Route path='/view' component={View}/>


          </Switch>
        </div>
      </BrowserRouter> 
      </div>

    );
  }
}

而view.js页面如下:

    componentWillMount(){

    let postRef = database().ref('posts').orderByKey().limitToLast(100);
    postRef.on('value', snapshot => {

      let post = { title: snapshot.title, id: snapshot.key };
      this.setState({ posts: [post].concat(this.state.posts) });
    });
    console.log(postRef);
  }

  }

  render() {


    return (
      <div >

      </div>

    );
  }
}

对不起。现在有点裸露,因为我删除了我尝试过的所有内容。我用了几篇文章和视频试图弄清楚,但没有任何效果。然而,我用于索引页面的原始生命周期方法和构造函数是这样的:

constructor(props){
    super(props);
    this.state = {
      title: '',
      body: '',
      posts:{}
    };
    this.onInputChange = this.onInputChange.bind(this);
    this.onHandleSubmit = this.onHandleSubmit.bind(this);
  }

  componentDidMount(){
    database.on('value', snapshot => {
      this.setState({
        posts: snapshot.val()
      });

    });
  }

对不起,我知道要完成很多工作,但我认为我应该涵盖所有可能有用的内容。但总结一下:我的问题是如何从数据库中检索帖子,然后将 Firebase 自动生成的密钥添加到链接中,从而将其呈现在新页面中。

附言。我的数据库是这样导出的

export const database = firebase.database().ref('/posts’);

【问题讨论】:

  • @LukeSchlangen 有什么想法吗?抱歉又把你赶出去了

标签: javascript reactjs firebase firebase-realtime-database react-router


【解决方案1】:

我不明白这个问题,但听起来post 键包含您想要的链接值。如果是这种情况,请尝试...

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>
      )}
    );

那么您应该可以在您的渲染方法中调用您的 renderPosts 函数。

render() {
    return (
      <div >
       {renderPosts()}
      </div>
    );
  }

如果你调用 firebase 可能需要一点时间来获取 post 数据,所以只有在 post 数据出现时才调用 render 方法。

render() {
        return (
          <div >
           {this.state.posts && renderPosts()}
          </div>
        );
      }

【讨论】:

  • 如果我完全误解了这个问题和问题,你能否重新表述你正在尝试做的事情,因为它很难理解。问题是什么?它在控制台中说什么吗?请分享您遇到的任何错误。
  • 我在上面的回复中的第一个代码块中有一个愚蠢的错字。我忘了添加地图功能。立即尝试。
  • 为页面编写一个新组件并创建一个到它的路由。路由路径将是path='/view/posts/:postId,因为这是您在链接中输入的内容。然后您可以在新页面中使用this.props.match.params.postId 来获取密钥。如果您需要获取特定于该页面的数据,请在 componentDidMount 中触发对 firebase 的新调用。这是一个单独的问题,您应该打开一个新的堆栈问题,以便人们可以单独帮助您。看看 react router docs,这样你就可以问你足够了解来问一个特定的问题了。
  • 另外,如果第二个代码块正在工作,则忽略第三个。
  • 协调时差太麻烦了,我在这里尽力解释一下我的意思stackoverflow.com/questions/48617671/…
猜你喜欢
  • 1970-01-01
  • 2016-10-20
  • 1970-01-01
  • 2019-07-21
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
相关资源
最近更新 更多