【问题标题】:How to create a nested array store that updates to local storage in Svelte?如何在 Svelte 中创建一个更新到本地存储的嵌套数组存储?
【发布时间】:2021-05-20 13:45:23
【问题描述】:

我想创建一个对象作为存储,其中对象中的数组也可以用作存储。每个数组都需要更新(订阅),对象也需要更新到本地存储。

这是对象的结构

{
   "expenses":[
      {
         "name":"sam",
         "id":1
      },
      {
         "name":"bob",
         "id":2
      }
   ],
   "options":[
      ...
   ]
}

这是我目前的代码:

import { writable } from "svelte/store";

// get local storage
let storage = localStorage.getItem("userInputs");

// if storage exists, use it. otherwise set empty array
export let userInputs = writable(JSON.parse(storage) || []);
export let userExpenses = writable(storage.expenses || []);
export let userOptions = writable(storage.options || []);

// subscribe inputs to localStorage
userInputs.subscribe((val) =>
    localStorage.setItem("userInputs", JSON.stringify(val))
);

我希望能够在整个应用程序中使用 userExpensesuserOptions 作为商店。当这些数组更新时,它们需要在主 userInputs 对象中更新,这需要推送到 localStorage。

谢谢

【问题讨论】:

    标签: arrays local-storage svelte svelte-store


    【解决方案1】:

    您可以为此使用 svelte 很棒的 derived 函数,例如

    // create userInputs as derived which results in a store
    // that is updated whenever userExpenses or userOptions
    // are.
    const userInputs = derived(
       [userExpenses, userOptions], 
       ([ue, uo]) => ({
          userExpenses: ue,
          userOptions: uo
       })
    );
    
    // sync to localStorage
    userInputs.subscribe(val => {
        localStorage.setItem("userInputs", JSON.stringify(val));
    });
    

    【讨论】:

    • 太棒了——这就是我想要的。我在搜索中遇到了派生词,但它超出了我的想象。
    • 很高兴它有帮助。当我第一次遇到derived 时,它也让我大吃一惊。但是一旦你用过几次,你就不想错过了。
    猜你喜欢
    • 2020-10-27
    • 1970-01-01
    • 2017-04-20
    • 2021-04-10
    • 2014-05-10
    • 2021-08-10
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    相关资源
    最近更新 更多