如何保持苗条的商店

Ani*_*das 2 svelte svelte-store

是否有任何直接选项可以保留临时存储数据,以便即使刷新页面也可以使用数据。

我不使用本地存储,因为我希望这些值是反应性的。

Spe*_*pen 17

对于 Svelte Kit,我遇到了 SSR 问题。这是我基于Svelte Kit FAQMatyanson 的答案Adnan Y 的答案的解决方案。

作为奖励,如果发生localStorage更改(例如在不同的选项卡中),此解决方案还会更新可写内容。所以这个解决方案可以跨选项卡工作。查看窗口:存储事件

将其放入打字稿文件中,例如$lib/store.ts

import { browser } from '$app/env';
import type { Writable } from 'svelte/store';
import { writable, get } from 'svelte/store'

const storage = <T>(key: string, initValue: T): Writable<T> => {
    const store = writable(initValue);
    if (!browser) return store;

    const storedValueStr = localStorage.getItem(key);
    if (storedValueStr != null) store.set(JSON.parse(storedValueStr));

    store.subscribe((val) => {
        if ([null, undefined].includes(val)) {
            localStorage.removeItem(key)
        } else {
            localStorage.setItem(key, JSON.stringify(val))
        }
    })

    window.addEventListener('storage', () => {
        const storedValueStr = localStorage.getItem(key);
        if (storedValueStr == null) return;

        const localValue: T = JSON.parse(storedValueStr)
        if (localValue !== get(store)) store.set(localValue);
    });

    return store;
}

export default storage
Run Code Online (Sandbox Code Playgroud)

可以这样使用:

import storage from '$lib/store'

interface Auth {
    jwt: string
}

export const auth = storage<Auth>("auth", { jwt: "" })
Run Code Online (Sandbox Code Playgroud)


mic*_*mic 9

来自https://github.com/higsch/higsch.me/blob/master/content/post/2019-06-21-svelte-local-storage.md by Matthias Stahl:

假设我们有一个名为count.

// store.js
import { writable } from 'svelte/store';

export const count = writable(0);

// App.svelte
import { count } from 'store.js';
Run Code Online (Sandbox Code Playgroud)

为了使存储持久化,只需将函数包含useLocalStoragestore对象中即可。

// store.js
import { writable } from 'svelte/store';

const createWritableStore = (key, startValue) => {
  const { subscribe, set } = writable(startValue);
  
  return {
    subscribe,
    set,
    useLocalStorage: () => {
      const json = localStorage.getItem(key);
      if (json) {
        set(JSON.parse(json));
      }
      
      subscribe(current => {
        localStorage.setItem(key, JSON.stringify(current));
      });
    }
  };
}

export const count = createWritableStore('count', 0);

// App.svelte
import { count } from 'store.js';

count.useLocalStorage();
Run Code Online (Sandbox Code Playgroud)

然后,在您App.svelte刚刚调用该useLocalStorage函数以启用持久状态。

这在Routeify 中对我来说非常有效。对于工兵,JHeth建议“只是将count.useLocalStorage()onMountif (process.browser)在组件上使用的商店。”

  • 为了使其在 Sapper 中工作,只需将 `count.useLocalStorage()` 放置在 `onMount` 中,或者将 `if (process.browser)` 放置在使用存储的组件中。 (3认同)

Tho*_*lle 7

您可以手动创建商店的订阅,并将更改持久保存到localStorage,还可以将localStorage中的潜在值用作默认值。

<script>
  import { writable } from "svelte/store";
  const store = writable(localStorage.getItem("store") || "");

  store.subscribe(val => localStorage.setItem("store", val));
</script>

<input bind:value={$store} />
Run Code Online (Sandbox Code Playgroud)

  • 这在苗条中正常工作。在 Sapper 中使用它的推荐方法是什么。我创建了一个单独的 JS 文件,如下所示 export const name = writable(localStorage.getItem("store") ||'world'); name.subscribe(val =&gt; localStorage.setItem("store", val)); 但这不在工兵中运行,因为 localStorage 在服务器中不可用 (5认同)
  • @AnilSivadas 在服务器上做这件事有点复杂。您可以在服务器上跳过它,并在使用 localStorage 之前使用 `typeof window !== 'undefined'` 检查在浏览器中执行它。 (5认同)
  • [此处](/sf/ask/3964573511/)描述了一个类似/相同的示例,包括使用“{#if process.browser}”的解决方案(与@Tholle描述的类似)。 (2认同)

use*_*314 6

找到了一个名为svelte-persisted-store 的库,它实现了此功能。为我工作。

安装:

npm install svelte-persisted-store
Run Code Online (Sandbox Code Playgroud)

他们的自述文件中的示例:

// in store.ts or similar
import { persisted } from 'svelte-persisted-store'

// First param `preferences` is the local storage key.
// Second param is the initial value.
export const preferences = persisted('preferences', {
  theme: 'dark',
  pane: '50%',
  ...
})


// in views

import { get } from 'svelte/store'
import { preferences } from './stores'

preferences.subscribe(...) // subscribe to changes
preferences.update(...) // update value
preferences.set(...) // set value
get(preferences) // read value
$preferences // read value with automatic subscription
Run Code Online (Sandbox Code Playgroud)