Vuex 状态与 Firebase 同步

Vuex state in sync with Firebase

我遵循一些准则使我的 Vue.js 状态与 Firebase 同步。我已经在一个单独的文件夹存储中设置了对 Firebase 和 getters、mutations 和 actions in vue 的引用。当我在没有 Firebase 连接(本地)的情况下更新状态时它似乎有效,当我仅使用 Firebasereference 和推送从其他组件更新 Firebase 时它也有效 - 然后同步似乎有效。我的问题是我是否应该更新状态 throw "action / mutation" 并且突变将推送到状态数组并且 Firebase 将以某种神奇的方式更新,这在我的情况下不会发生。

所以 - 如何更新?从使用引用的组件,例如 dbOrdersRef.push(order) 或调用商店,例如 this.$store.dispatch('setOrder', order) 不更新 Firebase (但其他局部变量更新)。

我觉得方案应该是这样的:

您应该以某种方式订阅 firebase 更新(我不熟悉 firebase,但我确信应该有某种机制)并且当更新来自 firebase 时 - 您应该通过调度一些操作来改变您的商店, 让您的存储与 firebase 保持同步。

理想情况下,您的应用应仅适用于您的商店。 Store 应该隐藏诸如 firebase 使用等实现细节。如果明天你将从 firebase 切换到其他东西,你不应该重写与商店一起工作的组件。他们仍将与商店合作并执行相同的操作。

当您更新商店中的内容时,您也需要更新 firebase。我觉得你可以在行动上做到正确,应该没问题。通过这种方式,您可以确定将出现在您商店中的所有更改都将在 Firebase 中。例如。你调用 someAction 实际上做了一些 firebase 操作。如果您订阅了 firebase 更改,除了为 firebase 发送一些命令外,您甚至不会在该操作中执行其他操作,因为您的订阅将更新您的商店。或者你可以立即改变商店(又名乐观更新),然后等待来自 firebase 的响应,然后决定离开那个更新或调用一些突变来回滚(但是在这里你应该非常小心,因为订阅 firebase 更改)。

或者,您也可以为您的商店编写一些插件,只有当您的商店发生某些更改时,它才会向 firebase 发送更新。在这种情况下,您应用程序的更新首先会出现在您的本地商店中,然后您的插件会将它们发送到 firebase(也许这样的插件甚至已经存在,idk)。

我不是 Firebase 方面的专家,但我试图分享一些关于它应该如何工作的想法。希望这有帮助。

哦,回到你的问题:

dbOrdersRef.push(order) or with a call to the store with for example this.$store.dispatch('setOrder', order) which don't updates Firebase

我认为您根本不应该在组件中使用 firebase,而应该使用您的商店。所以我宁愿建议使用第二个选项。但是你应该自己实现 firebase 更新,默认情况下没有从商店到 firebase 的魔法更新(至少如果你没有使用具有那个魔法的插件)。