【问题标题】:Why is firestore where clause not working with state?为什么 firestore where 子句不适用于状态?
【发布时间】:2020-05-14 21:06:54
【问题描述】:

我正在尝试使用 react js 中的 where 子句从 firestore 过滤文档。但是,当我在 where 子句中使用状态变量时,它不起作用,但是当我提供实际字符串时,它开始工作

不工作

firebase.firestore().collection('Partners')
    .where("Email",'==',this.state.currentUser).get().then( querySnapshot => {
      querySnapshot.forEach(doc => {

        this.setState({
          Theatre:doc.data().Theatre
        })

    })
})

工作

firebase.firestore().collection('Partners')
    .where("Email",'==',"test@test.com").get().then( querySnapshot => {
      querySnapshot.forEach(doc => {

        this.setState({
          Theatre:doc.data().Theatre
        })

    })
})

任何帮助将不胜感激。谢谢。

编辑 我什至尝试过console.log(this.state.currentUser==='test@test.com'),它正在实现。然而 where 子句不适用于状态变量

【问题讨论】:

  • 您将不得不进行一些调试并找出this.state.currentUser 在您使用它时的值。 console.log() 应该有帮助。
  • state.currentUser 中的内容是电子邮件,否则将是错误

标签: javascript reactjs google-cloud-firestore where-clause


【解决方案1】:

可能是您的状态变量有问题,例如 setState 的异步效果或任何其他可能的原因。

确保您的状态变量 currentUser 具有值。为了安全起见,请在 if 条件下运行此函数:

if(this.state.currentUser){
 firebase.firestore().collection('Partners')
     .where("Email",'==',this.state.currentUser).get().then( querySnapshot => {
       querySnapshot.forEach(doc => {

         this.setState({
           Theatre:doc.data().Theatre
         })

     })
 })
}

为了调试,尝试控制台记录它。

【讨论】:

  • 我确实控制台记录了查询快照中的状态,并且值很好。但是控件没有进入foreach循环。
  • 可能没有找到将电子邮件设置为状态变量值的特定文档?
  • 但是当我在 where 子句中对电子邮件字符串进行硬编码时,它可以正常工作,并且状态变量具有相同的值。
【解决方案2】:

React 状态是异步的,您确实会在控制台中获得状态值,但是当运行 firestore 查询时,因为它也是异步的,您的状态会以某种方式被覆盖,或者您的页面可能正在刷新并且再次设置状态。

我遇到了同样的问题,然后我检查了我的页面正在刷新,并且我失去了我设置的状态,即使我确实在 console.log() 中得到了它,但是当我运行查询的 firestore 没有状态。

您需要在此处提供整个代码,以便我们查看。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多