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

标签 svelte svelte-3 svelte-store

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/

相关文章:

svelte - 如何返回 Svelte 组件的渲染 HTML?

javascript - 将 CSS 自定义属性动态添加到 svelte 组件 3.38.0

svelte - 从 Svelte Store 获取/读取值(value)

设置存储值的 Svelte 用户注册问题

svelte - 使用 Svelte 派生存储从多个存储数据创建单个状态对象

javascript - 为什么派生的 Svelte 商店在使用 `$` 和 `subscribe` 时会有不同的行为

json - 工兵/ slim : how to fetch a local json file to retrieve data

css - Svelte:内联 CSS 动画不起作用

tailwind-css - 如何在 SvelteKit 中使用 Tailwind 背景图片

Svelte/Sapper 如何在不提供绝对 URL 的情况下从内部 api 获取数据