Relevant REPL
我有一个简单的可写存储,带有自定义 set
方法:
import { writable } from 'svelte/store';
function createState() {
const {subscribe, set, update} = writable({a: 0, b: 0});
return {
subscribe,
set: (newState) => {
console.log(newState);
// set(newState); // I would expect `state` to be unchanged without this
}
};
};
export const state = createState();
当我打电话时state.set(<some new value>)
,新值记录到控制台,值 state
实际上并没有改变。这是我所期望的。但是,如果我分配
$state = <some new value>
,state
的值更改,然后 set
将其记录到控制台。为什么(以及如何)会发生这种情况,以及是否有办法在不重新实现的情况下解决此问题 writable
?谢谢!
最佳答案
这是预期的行为!暂时忘掉商店吧——因为 state.set
在您的示例中是一个 noop - 删除该行:
<script>
// import { state } from "./stores.js";
let pojo = { a: 0, b: 0 };
pojo.a = 1;
pojo = {d: 0};
//state.set({c: 0}); // no effect, as expected
</script>
<h1>state: {JSON.stringify(pojo)}</h1>
结果...
state: {"d":0}
……正是您所期望的。
当我们更换
pojo
与 $state
,我们仍在分配(或改变)一个具有相同 react 特性的局部变量。唯一的区别是我们还调用了 state.set
.通常,这会导致存储值发生变化,并将反射(reflect)给其订阅者,但由于您的自定义存储不这样做,我们留下了上次 $state
之后的值。被赋值运算符触及。
关于Svelte 存储分配调用默认 writable().set 然后自定义 .set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63027877/