svelte - 如何检索 Sveltekit page.js 文件上的 localStorage 数据?

标签 svelte server-side-rendering sveltekit

我是 Sveltekit 新手,我正在尝试在不同路线之间共享数据。我知道存储存储在内存中,并在我们更改路线时消失,这就是为什么我使用 localStorage 在路线之间保留数据。

src/stores/stores.js


import { writable } from 'svelte/store';

const storedUsers = JSON.parse(window.localStorage.getItem('users')) || [];

export const users = writable(storedUsers);

users.subscribe((value) => window.localStorage.setItem('users', JSON.stringify(value)));

当我的应用程序启动时,我可以通过执行以下操作来更新 src/routes/+page.svelte 默认路由上的商店:

src/routes/+page.svelte


<script>
    import { users } from './stores/stores.js';

    function addUser() {
        users.update(list => [...list, `user-${list.length}`]);
    }
</script>

<button on:click={addUser}>Add User</button>

但是,当我尝试从另一个路由(使用+page.js)检索此列表时,我收到ReferenceError:窗口未定义。我知道这段代码是在浏览器上运行的,那么为什么没有定义 window 呢?如何检索 localStorage 数据?

src/routes/mylist/+page.js


import { browser } from '$app/environment';

export async function load() {
    const myList = await JSON.parse(window.localStorage.getItem('mylist'));
    console.log({ browser, myList }); // browser is true
}

最佳答案

+page.js加载函数实际上在客户端和服务器上运行。这就是您收到该错误的原因。

最简单的解决方案是根本不使用localStorage。我认为适合您的情况最好的主意是使用 sveltekit hooks ,以及 locals 参数。

脚手架看起来像这样:

import type { Handle } from '@sveltejs/kit';
 
export const handle = (async ({ event, resolve }) => {
  event.locals.user = /* your things */;

  return await resolve(event);
}) satisfies Handle;

如果您想继续使用 localStorage,我认为您只需要检查您是否在浏览器中的加载功能上(最好的方法是使用 the browser const that sveltekit exports ),或者执行以下操作使用 onMount 回调在 +page.js 中“获取”数据。

关于svelte - 如何检索 Sveltekit page.js 文件上的 localStorage 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75770128/

相关文章:

javascript - 如何在 svelte 中实现 Draggable Bottom Sheet Modal?

testing - 维特测试 : Failed to resolve import "$lib/stores/store"

azure - 将 NextJs SSR 部署到 Azure 静态 Web 应用

couchdb - PouchDB 和 SvelteKit

svelte - 如何在 sveltekit netlify 中使用文件 api

svelte - 如何验证传递的 prop 是否是 Svelte 中的组件类型?

javascript - 如何引用 Svelte 组件的父组件?

javascript - 在单组件 svelte 中导入传单

angular - 根路径未正确渲染 Angular Universal

angular - 我可以预渲染 Angular 并从 S3 回退到 SSR 吗?