Reactjs 反应Firebase回调

Reactjs 反应Firebase回调,reactjs,firebase,firebase-realtime-database,Reactjs,Firebase,Firebase Realtime Database,大约一年前,我开始学习使用Firebase进行React,我想一切都进行得很顺利。然而,自从我开始写作以来,我真的很怀念掌握回调的艺术,就像我对斯威夫特所做的那样 我觉得几乎没有任何关于回调和Firebase使用React的直接信息。例如,我曾多次希望能够使用回调,但最终编写了许多额外的函数来执行完全相同的任务。例如,我希望能够调用一个函数,然后在快照中返回一个值。一次。但是怎么做呢 你看,这是我此刻面临的问题的一个例子。我目前正在我的网站上列出一个用户列表,包括以下信息:firstname、l

大约一年前,我开始学习使用Firebase进行React,我想一切都进行得很顺利。然而,自从我开始写作以来,我真的很怀念掌握回调的艺术,就像我对斯威夫特所做的那样

我觉得几乎没有任何关于回调和Firebase使用React的直接信息。例如,我曾多次希望能够使用回调,但最终编写了许多额外的函数来执行完全相同的任务。例如,我希望能够调用一个函数,然后在快照中返回一个值。一次。但是怎么做呢

你看,这是我此刻面临的问题的一个例子。我目前正在我的网站上列出一个用户列表,包括以下信息:firstname、lastname和companyId。在显示时,我希望能够验证companyId是否确实存在于一个单独的名为“companys”的表中,该表的结构如下:

公司->唯一公司ID->信息

我知道我不能在异步函数中返回值,但我想的是:

isCompanyVerified(input){
  databaseCompanies.child(input).once('value', (snapshot) => {
     if(snapshot.val().isVerified){
       return true;
     } else {
       return false;
     }
  })
}

<div>
allUsers.map((singleUser) => {
  return(
    <p>{singleUser.name}</p>
    <p>{this.isCompanyVerified(singleUser.companyId)}</p>
  )
})
</div>
isCompanyVerified(输入){
databasecompanys.child(输入).once('value',(快照)=>{
如果(snapshot.val().isVerified){
返回true;
}否则{
返回false;
}
})
}
alluser.map((单用户)=>{
返回(
{singleUser.name}

{this.isCompanyVerified(singleUser.companyId)}

) })
如果有人能向我解释我将如何以正确的方式做这件事,或者至少能为我指明正确的方向,那对我来说将是非常重要的。问题是我真的不知道去哪里寻找信息

我习惯于将所有网络/数据库功能都放在一个文件中,就像我在Swift中所做的那样,比如“networking.Swift”。然后执行从特定文件获取的函数调用。使用React,我将所有代码都放在每个组件中,导致大量重复代码、大量额外工作,并使其看起来都是非结构化的

我现在对语法相当熟悉,我相信我已经学到了很多,但我觉得我做了很多错事,还有很多东西要学。哪里是我学习真正掌握反应的最好地方?从中级到“有经验的”(编写和组织代码就像应该完成的那样)


感谢所有的帮助。我写这篇文章是因为我真的很想努力学习。

你不能像这样直接在react中编写dom。在这种情况下,不会重新呈现dom。将验证数据存储在一个状态中,一旦异步数据到达,就会重新呈现dom

解决方案1 这是单个
UserItem
组件的实现:

UserItem.js

class UserItem extends React.Component {
  state {
    isUserVerified: false
  }

  handleVerified = snapshot => {
    this.setState({ isUserVerified: snapshot.val().isVerified })
  }

  componentDidMount {
    const {userId} = this.props;
    databaseCompanies.child(userId).once('value', this.handleVerified)
  }

  render() {
    const { isUserVerified } = this.state;

    return (
     <div>{isUserVerified ? 'verified' : 'not verified'}</div>
    )
  }
}
...
render(){
  allUsers.map(singleUser => <UserItem userId={singleUser.id} />
}
这将在该州产生类似的结果:

state = {
  users: {
    _key1: { id..., verified: true },
    _key2: { id..., verified: false }
   ...
  }
}

并通过它们绘制地图。

看看这篇文章:或这篇文章:。他们可能会给出答案吗?谢谢你的回答。不幸的是,这并不是我想要的。你看,我知道如何通过firebase读取、编辑、保存和删除数据。然而,我的问题是,如何通过从函数返回数据快照并写入结果,从数据快照中获取特定值。我可以直接处理结果,而不是将其存储在状态中。但这正是状态设计的目的。我会说将其存储在状态中,并从状态中呈现用户项。好的,我明白你的意思。但我的问题恰恰是国家。在我看来,存储密钥和Id之类的信息是不安全的,因为您可以篡改状态值并获取不应该访问的信息。还是我错了?“从不信任用户”原则发生了什么?更具体地说;假设您获取常规用户信息,isAdmin(true/false)值决定您的权限,敏感弹出窗口仅用于管理员访问,您使用条件呈现(true/false)检查用户是否为管理员。你所需要做的就是在谷歌开发者工具中将状态从false改为true,然后你就可以作为管理员导航了。还是我错了?啊,好吧,有道理。在我的第一个解决方案中,我存储的数据并不比你多,只存储一个布尔值。我以我想象的方式完成了代码。我如何确保应用程序更安全?我想您可以微调请求查询以过滤掉敏感数据,并从后端仅获取带有用户id的所需布尔值。可能吗?
state = {
  users: {
    _key1: { id..., verified: true },
    _key2: { id..., verified: false }
   ...
  }
}