Joh*_*que 6 svelte svelte-store svelte-3
我有一个带有自定义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();
Run Code Online (Sandbox Code Playgroud)
当我调用 时state.set(<some new value>),新值会记录到控制台,而 的值state实际上并没有改变。这是我所期望的。
但是,如果我分配$state = <some new value>,state更改的值,然后 set将其记录到控制台。为什么(以及如何)会发生这种情况,有没有办法在不重新实现的情况下解决它writable?
谢谢!
这是预期的行为!暂时忘记商店,因为 \xe2\x80\x94state.set是示例中的一个 noop \xe2\x80\x94 删除该行:
<script>\n // import { state } from "./stores.js";\n\n let pojo = { a: 0, b: 0 };\n pojo.a = 1;\n pojo = {d: 0};\n\n //state.set({c: 0}); // no effect, as expected\n</script>\n\n<h1>state: {JSON.stringify(pojo)}</h1> \nRun Code Online (Sandbox Code Playgroud)\n结果...
\n\n\n\n
state: {"d":0}
...正是您所期望的。
\n当我们替换pojo为$state时,我们仍然分配(或改变)具有相同反应特性的局部变量。唯一的区别是我们也调用state.set. 通常,这会导致存储值发生变化,并反映到其订阅者,但由于您的自定义存储不会这样做,因此我们留下了上次被赋值$state运算符触及后的值。