如何在修改Svelte store时同步更新Firebase实时数据库?
问题描述
我见过很多从Firestore更新Svelte store的示例,但我使用的是Firebase实时数据库,希望数据库能随Svelte store的修改而更新。目前我有多个如下所示的函数:
// Saves a list of the selected profiles to the scenario data export const saveProfileData = (dataStore, sliderStore, popupIDs, scenarioID) => { const sliderData = get(sliderStore); const data = get(dataStore); const scenarioData = data[scenarioID] scenarioData.profileSave = {} for (const popupID of popupIDs){ if (sliderData[popupID].hasOwnProperty("slider3")){ scenarioData.profileSave[popupID] = sliderData[popupID].slider3.profile } } dataStore.set(data) }
其中dataStore是我想要与数据库同步的Svelte writable store(因为数据库中的云函数会执行相关计算)。注意我还有一个独立的sliderStore,不需要同步。
我了解sveltefire这类可实现从服务器到UI同步的工具,那么我是否应该在函数中更新数据库,再通过该工具进行同步?
解决方案
完全可以采用这种双向同步的思路,具体操作如下:
- 本地修改后先推送到数据库:在
saveProfileData函数里,完成scenarioData.profileSave的修改后,除了调用dataStore.set(data)更新本地store,还要用Firebase实时数据库的API把修改的部分上传到云端。示例代码如下:import { ref, set } from "firebase/database"; // ... 你的现有代码 dataStore.set(data); // 新增:推送修改到数据库 const profileSaveRef = ref(db, `scenarios/${scenarioID}/profileSave`); set(profileSaveRef, scenarioData.profileSave); - 用SvelteFire同步云端变更到本地:通过SvelteFire监听对应数据库路径的变化,一旦云端数据有更新(比如云函数执行后的修改),自动同步到
dataStore中。这样不管是本地发起的修改,还是云端触发的变更,都能保证dataStore和数据库的数据一致。
额外注意点:
- 避免循环更新:如果SvelteFire的监听回调会直接更新
dataStore,要注意区分是本地推送的变更还是云端的新变更,防止出现“本地更新数据库→监听回调更新本地→又推送数据库”的循环。可以在更新时加临时标记,或者在回调里对比数据是否有实际变化再更新。 - 优化更新粒度:不要每次都推送整个
data对象到数据库,只更新修改的部分(比如示例里的profileSave),这样能减少带宽消耗和数据库写入次数。
内容的提问来源于stack exchange,提问作者Hugh
相关产品推荐
相关产品推荐

