无法重置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
相关产品推荐
相关产品推荐

