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

Posted

技术标签:

【中文标题】firebase(firestore)和vuejs + vuefire的非常奇怪的反应性问题【英文标题】:Very weird reactivity issue with firebase (firestore) and vuejs + vuefire 【发布时间】:2020-10-12 03:08:34 【问题描述】:

我遇到了一些非常奇怪的问题,我完全陷入困境。

我有这个组件:

<template>
  <v-card elevation="0">
    <h2>Accounts</h2>
    <v-simple-table fixed-header >
      <template v-slot:default>
        <thead>
          <tr>
            <th class="text-left">Account ID</th>
            <th class="text-left">Broker</th>
            <th class="text-left">Balance</th>
          </tr>
        </thead>
        <tbody>
          <tr v-for="account in accounts" :key="account.accountId">
            <td> account.accountId </td>
            <td> account.broker </td>
            <td> accountBalances[account.accountId] </td>
          </tr>
        </tbody>
      </template>
    </v-simple-table>
  </v-card>
</template>

<script>
import  DB  from "../../firebase/db";

export default 
  name: "Accounts",
  data: () => (
    cashTransactions: [],
    accounts: [],
    newAccount: []
  ),
  computed: 
    accountBalances: function() 
      try 
        let balances = ;
        this.accounts.forEach(account => 
          let accBal = 0;
          const transactions = this.cashTransactions.filter(acc => 
            return acc.accountId === account.accountId;
          );
          transactions.forEach(transaction => 
            accBal += Number(transaction.amount);
          );
          balances[account.accountId] = accBal;
        );
        return balances;
       catch (err) 
        console.error(err);
        return err;
      
    
  ,
  firestore: 
    cashTransactions: DB.collection("cashTransactions"),
    accounts: DB.collection("accounts")
  
;
</script>

<style scoped></style>

这个firestore集合:

当我像这样在我的组件中定义 firestore 时:

  firestore: 
    cashTransactions: DB.collection("cashTransactions"),
    accounts: DB.collection("accounts")
  

只有 accounts 属性是响应式的 - 例如,我将文档添加到集合中,它会实时更新(排序)。

如果我这样定义:

  data: () => (
    accounts: [],
    cashTransactions: [],
    newAccount: []
  ),
  firestore: 
    accounts: DB.collection("accounts"),
    cashTransactions: DB.collection("accounts")
  

也只有帐户是被动的。

如果我这样定义:

  data: () => (
    accounts: [],
    cashTransactions: [],
    newAccount: []
  ),
  firestore: 
    accounts: DB.collection("cashTransactions"),
    cashTransactions: DB.collection("accounts")
  

accounts 对 cashTransactions-collection-data 具有反应性,但 cashTransactions 属性(带有 accounts-collection-data)仍然没有反应性

如果我把它设置回

  data: () => (
    accounts: [],
    cashTransactions: [],
    newAccount: []
  ),
  firestore: 
    accounts: DB.collection("accounts"),
    cashTransactions: DB.collection("cashTransactions")
  

accounts 属性与 accounts-collection-data 反应,而 cashTransactions 属性保持非反应性

所以,无论我做什么,cashTransactions 属性都是非反应性的,只会在页面刷新时“刷新”。

有人知道我做错了什么吗?

谢谢!

【问题讨论】:

【参考方案1】:

您可以在firestore(): 之后尝试以下解决方法

watch: 
    cashTransactions(): 
        deep: true,
        handler(newArray) 
            console.log( 'Change detected...' );
         
    ,

希望这会有所帮助。

【讨论】:

以上是关于firebase(firestore)和vuejs + vuefire的非常奇怪的反应性问题的主要内容,如果未能解决你的问题,请参考以下文章

Vuejs 和 Firestore - 如何在 Firestore 中的数据更改时进行更新

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

检索数据时出现 Vue/Firestore/Firebase 错误

带有 vuejs 的 Firebase 数据库:default.collection 不是函数

使用 firebase 在 Vuejs 应用程序上执行日常计算

除非在 vuejs2 中通过热重载更改代码,否则 firebase 存储不会运行