You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 19:45:12