【问题标题】:Fetching one document from firebase (Vue)从 firebase (Vue) 获取一份文档
【发布时间】:2018-11-03 20:43:18
【问题描述】:

我正在尝试根据我使用自动生成的 firebase ID 检索文档的路由参数 (id) 从 firebase 获取特定文档。

但是,没有返回任何数据。

使用 when() 方法,我想检索一个具有与我的查询匹配的自动生成 ID 的特定文档...我正在使用 ("id", "==", $this.route. params.id)... 在引用自动生成的 ID 时,“id”是正确的语法吗?

稍后我将操作 UI,现在,我只是在模板中添加了这个...

<template>
 <div>
  <h1>{{ huddle.goal }}</h1>
  <h1>{{ huddle.headline }}</h1>
  <h1>{{ huddle.body }}</h1>
 </div>
</template>

然后我的脚本中有这个...

<script>
import db from "./firebaseInit"
export default {
  name: "HuddleSpace",
  data() {
    return {
      id: this.$route.params,
    }
  },
  created() {
    this.fetchData()
  },
  watch: {
    "$route": "fetchData"
  },
  methods: {  
    fetchData() {
      db.collection("huddle").where("id", "==", 
       this.$route.params.id).get().then(querySnapshot => {
        querySnapshot.forEach(doc => {
         const huddle = {
            goal: doc.data().goal,
            headline: doc.data().headline,
            body: doc.data().body
          }
        })
      })
    }
  },
}
</script>

我将不再使用 Vue Router 文档“导航后获取数据”/用于获取数据的 firebase 文档/youtube 上的一些视频,所以我不确定逻辑是否合理。

【问题讨论】:

  • 最好总是问一个特定的问题或解释你的代码遇到了什么问题。你应该仔细看看你对收到的回复文档做了什么。

标签: firebase vue.js vuejs2 google-cloud-firestore


【解决方案1】:

您无需进行查询, 您处理的 id 是文档 id,所以要使用它 =>

db.collection('huddle').doc(this.$route.params.id)
.get().then(snapshot => {
    if (!snapshot.exists) return;
    let data = snapshot.data() // 
    // continue your code
});

// where("id", "==", this.$route.params.id) =>这会进行查询以获取具有指定值的字段名称(id)的文档($this.route.参数.id)

【讨论】:

    【解决方案2】:

    您的问题来自您的huddle 对象未包含在data 对象中,因此它未添加到“Vue 的反应系统”中。详情请参阅https://vuejs.org/v2/guide/instance.html#Data-and-Methods

    你应该这样做:

    <script>
    import db from "./firebaseInit"
    export default {
      name: "HuddleSpace",
      data() {
        return {
          id: this.$route.params.id,
          huddle: {}
        }
      },
      created() {
        this.fetchData()
      },
      watch: {
        "$route": "fetchData"
      },
      methods: {  
        fetchData() {
          db.collection("huddle").where("id", "==", 
           this.$route.params.id).get().then(querySnapshot => {
            querySnapshot.forEach(doc => {
             this.huddle = {
                goal: doc.data().goal,
                headline: doc.data().headline,
                body: doc.data().body
              }
            })
          })
        }
      },
    }
    </script>
    

    【讨论】:

    • 谢谢,雷诺。在我发表这篇文章之前,原始代码中包含了空对象......无论哪种方式,我都尝试复制和粘贴您的代码,但仍然没有检索到任何数据。其他 vue 组件已经从 firebase 检索数据没有问题,并且也在路由器视图中呈现。由于我不完全理解调用firebase的逻辑,我认为问题可能出在那儿......
    • @AdrianCaballero 嗨,我在发布之前尝试了我的答案代码,它可以工作。如果您在fetchData() 的开头执行console.log(this.$route.params.id);,会发生什么?你得到正确的 id 了吗?
    • 很奇怪。我真的很感谢你帮我解决这个问题。我只是 console.loged this.$route.params.id 并且正确的 id 正在记录到控制台,但在我建立路由视图的地方仍然没有渲染。
    • @AdrianCaballero 好的,现在你可以用...get().then(querySnapshot =&gt; {console.log(querySnapshot.size); ....}) 检查querySnapshot 的大小并验证它是> 0
    • 目前记录为 0。这是什么意思?
    猜你喜欢
    • 1970-01-01
    • 2021-05-06
    • 2023-01-18
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多