如何在 svelte 中使用自定义存储方法?

Vae*_*tus 2 svelte svelte-store svelte-3

我正在制作一个模态,其属性存储在商店中。而不是像这样打开它,从一个元素:on:click={() => $modal.isOpen = true}

我想这样打开它: on:click={() => $modal.toggle()}从一个元素。

这是我的代码:

export const modal = writable({
    isOpen: false,
    title: 'Title',
    content: 'Content',
    toggle: () => {
        console.log(modal)
        modal.set({ ...modal, isOpen: true });
    }
}); 
Run Code Online (Sandbox Code Playgroud)

当我登录时modal,它只记录set, subscribe, update方法。然后当我再次单击时,这些方法消失了:它正确地覆盖了它们,似乎我永远无法获得模态的初始化状态。我尝试使用this或参数 ( (a, b) =>)访问当前对象,但都没有返回任何内容。

Ric*_*ris 7

传递给的参数writable只包含数据,不包含方法。要创建自定义商店,请按照本教程进行操作- 创建您自己的商店工厂,该工厂包装writable

const toggleable = initial => {
  const store = writable(initial);

  return {
    ...store,
    toggle: () => store.update(n => !n)
  };
};

const modal = toggleable(false);
Run Code Online (Sandbox Code Playgroud)

演示在这里:https : //svelte.dev/repl/682ef8309f924ba7ad8de1e2f5069988?version=3.12.1

  • `store.update` 采用*函数*,而不是值。该函数接收旧值并返回一个新值。所以应该是`store.update(old => ({ ...old, isOpen: !old.isOpen }))` (2认同)