在 vuefire 的 firestore 内的“this”中获取“undefined”

Posted

技术标签:

【中文标题】在 vuefire 的 firestore 内的“this”中获取“undefined”【英文标题】:Getting "undefined" in "this" inside firestore in vuefire 【发布时间】:2019-10-03 21:31:58 【问题描述】:

我在我的 Vue 应用程序中使用 firebase-auth 和 firebase-firestore,并使用 vuefire 从 firestore 检索用户数据。

所以,在我的例子中:

data() 
  return 
      user: firebase.auth().currentUser
  
,
firestore: 
  userData: db.collection("users").where("uid", "==", this.user.uid)

但是当代码执行时,“this”,应该是Vue的实例,是未定义的。 我该如何解决这个问题?

【问题讨论】:

您是否要在 vue 实例上定义一个名为 firestore 的道具?我认为您希望这是一种方法。 不,拼写正确……是vuefire的语法 【参考方案1】:

你必须返回你的数据,像这样:

data() 
    return 
      user: firebase.auth().currentUser
   

【讨论】:

我写这个问题的时候不好...返回已经定义了【参考方案2】:

您无法立即对商店做出反应。当时无法保证 firebase 实例已创建并且您可以使用它。

data() 
  user: ,
  userData: 
,

现在您可以从您的 Firestore 返回相同的属性

firestore () 
  return 
    user: firebase.auth().currentUser,
    userData: db.collection("users").where("uid", "==", firebase.auth().currentUser.id)
  

请注意,在上面的^ 中,您不能使用this.user.id,因为user 在您尝试访问之前可能尚未写入。但是你可以使用firebase.auth().currentUser.id

【讨论】:

他们可以使用beforeCreate() 钩子来启动组件吗? 请注意,表达式db.collection... 生成的是文档引用,而不是文档。 OP 必须执行异步操作(可能是 get())才能获取文档。 @LenJoseph firebase 没有任何必要。 firestore 定义在 created 上运行。 @danh 你不需要在这里异步执行它,因为vue-firestore 插件实际上为你处理了响应属性的等待和定义。 @danh Yep have a look at this line。它定义了响应属性并在将其应用到容器之前等待源。【参考方案3】:

我遇到了同样的问题,不知道为什么 this 未定义。作为一种解决方法,您可以在 created 钩子中使用 Programmatic binding,如下所示:

  created() 
    this.$bind('userData', db.collection("users").where("uid", "==", this.user.uid))
  ,

【讨论】:

与此同时,我不得不寻找另一种解决方法,但我测试了您的解决方案并完全满足了我当时的需求!

以上是关于在 vuefire 的 firestore 内的“this”中获取“undefined”的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 查询返回未定义快照的位置(Vue.js / Firestore / Vuefire)

Vuefire(Firestore)非常非常慢的查询

将 getter 设置到 vuefire 的 firestore 部分

vue + firestore:如何使用 vuefire 绑定/合并数据?

firebase(firestore)和vuejs + vuefire的非常奇怪的反应性问题

导入 firebase.firestore() 返回未定义