Svelte 存储分配调用默认 writable().set 然后自定义 .set?

Joh*_*que 6 svelte svelte-store svelte-3

相关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();
Run Code Online (Sandbox Code Playgroud)

当我调用 时state.set(<some new value>),新值会记录到控制台,而 的值state实际上并没有改变。这是我所期望的。
但是,如果我分配$state = <some new value>state更改的值,然后 set将其记录到控制台。为什么(以及如何)会发生这种情况,有没有办法在不重新实现的情况下解决它writable

谢谢!

Ric*_*ris 5

这是预期的行为!暂时忘记商店,因为 \xe2\x80\x94state.set是示例中的一个 noop \xe2\x80\x94 删除该行:

\n
<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> \n
Run Code Online (Sandbox Code Playgroud)\n

结果...

\n
\n

state: {"d":0}

\n
\n

...正是您所期望的。

\n

当我们替换pojo$state时,我们仍然分配(或改变)具有相同反应特性的局部变量。唯一的区别是我们调用state.set. 通常,这会导致存储值发生变化,并反映到其订阅者,但由于您的自定义存储不会这样做,因此我们留下了上次被赋值$state运算符触及后的值。

\n