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

无法重置Writable Store值求助:保留现有Store恢复默认值

解决Svelte Writable Store重置不生效的问题

问题根因

你直接修改了store里嵌套对象的属性,导致原始的defaults对象内部状态已经被篡改。调用reset()时传入的还是同一个defaults引用,Svelte的writable store会判定值没有变化,自然不会触发响应式更新。

解决办法

每次重置时生成一个全新的默认对象副本,让store能检测到值的变更。

修改后的代码

用原生的structuredClone()做深拷贝(现代浏览器均支持):

const defaults = {
  name: {
    value: "",
  },
  foo: [],
  some: {
    other: {
      data: ""
    }
  }
};
const store = writable(structuredClone(defaults));

export const myStore = {
  subscribe: store.subscribe,
  reset: () => {
    store.set(structuredClone(defaults));
  }
};

验证效果

$myStore.name.value = "foo";
console.log($myStore.name.value); // 输出 "foo"

myStore.reset();
console.log($myStore.name.value); // 输出 "",重置成功

兼容旧环境方案

如果你的运行环境不支持structuredClone(),可以手动实现深拷贝函数:

function deepCopy(obj) {
  if (obj === null || typeof obj !== 'object') return obj;
  if (Array.isArray(obj)) return obj.map(item => deepCopy(item));
  const copiedObj = {};
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      copiedObj[key] = deepCopy(obj[key]);
    }
  }
  return copiedObj;
}

// 替换使用deepCopy
const store = writable(deepCopy(defaults));
export const myStore = {
  subscribe: store.subscribe,
  reset: () => {
    store.set(deepCopy(defaults));
  }
};

内容的提问来源于stack exchange,提问作者Nick Jennings

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:35:20