【问题标题】:Object Key Not rendering React Component using firebase database对象键未使用 firebase 数据库呈现 React 组件
【发布时间】:2020-01-22 16:20:49
【问题描述】:

我正在尝试渲染组件,但它没有渲染。 我正在使用 Objectkey 循环通过 firebase 实时数据库 它在控制台中显示数据但不渲染组件 帮我解决。

它也显示了一些警告。

警告:函数作为 React 子级无效。如果您返回一个组件而不是从渲染中返回,则可能会发生这种情况。或者您可能打算调用此函数而不是返回它。

class UserPost extends React.Component {
render() {
return (
  <div className="userpost">
    {firebase
      .database()
      .ref()
      .child("post")
      .on("value", snapshot => {
        Object.keys(snapshot.val()).map((item, i) => (
          <Post
            key={i}
            title={snapshot.val()[item].title}
            username="Edward"
            image={snapshot.val()[item].post_img}
            comment={
              Object.getOwnPropertyNames(
                data.comments[snapshot.val()[item].comments]
              ).length
            }
            likes={
              snapshot.val()[item].likes
                ? data.likes[snapshot.val()[item].likes].length
                : null
            }
          />
        ));
      })}
  </div>
);

}

【问题讨论】:

  • 不确定这种方法是否可行,因为它可能试图呈现 Firebase 承诺,而不是链的最后一部分中的数据。但首先,为您的.on 步骤添加一个返回值,即return Object.keys...。如果仍然无法正常工作,请尝试将 Firebase 数据保存到状态,然后从该数据中渲染您的 &lt;Post/&gt;s
  • 还是不行
  • 它还显示了一些警告,例如警告:函数作为 React 子级无效。如果您从渲染返回一个组件而不是 ,则可能会发生这种情况。或者您可能打算调用此函数而不是返回它。

标签: javascript reactjs firebase-realtime-database components


【解决方案1】:

不推荐使用render 方法进行订阅。更喜欢对这种代码使用 React 生命周期方法(如 componentDidMount):

class UserPost extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      posts: {}
    }
  }

  componentDidMount() {
    firebase
    .database()
    .ref()
    .child("post")
    .on("value", snapshot => {
      this.setState({ posts : snapshot.val()})
    })
  }

  render() {
    return (
      <div className="userpost">
        {Object.keys(this.state.posts).map((item, i) => (
              <Post
                key={i}
                title={this.state.posts[item].title}
                username="Edward"
                image={this.state.posts[item].post_img}
                comment={
                  Object.getOwnPropertyNames(
                    data.comments[this.state.posts[item].comments]
                  ).length
                }
                likes={
                  this.state.posts[item].likes
                    ? data.likes[this.state.posts[item].likes].length
                    : null
                }
              />
            ))}
        </div>
      );
  }
}

【讨论】:

  • 是的,这是正确的,但有时从 firebase 数据库加载数据需要时间
猜你喜欢
  • 2021-08-13
  • 2021-05-28
  • 2017-08-27
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
相关资源
最近更新 更多