我来自React的背景,但是我要切换到Svelte和Sapper来开发我的下一个应用程序,以应对这些天React随附的庞大捆绑包规模。但是,我无法使用从localStorage检索的数据初始化Svelte的存储。
根据Sapper文档(https://sapper.svelte.dev/docs#Getting_started),我是通过npx degit "sveltejs/sapper-template#rollup" my-app从命令行运行来创建项目的。然后,我安装了依赖项,并删除了src文件夹中的演示代码。
然后,我创建了两个文件:src/routes/index.svelte和src/store/index.js。
两者的代码:
src / store / index.js
import {writable} from "svelte/store";
export let userLang;
if(typeof window !== "undefined") {
userLang = writable(localStorage.getItem("lang") || "en");
} else {
userLang = writable(null);
}
Run Code Online (Sandbox Code Playgroud)
src / routes / index.svelte
<script>
import {userLang} from "../store";
</script>
<p>Your Preferred Language: {$userLang}</p>
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序并点击index路由时,我看到以下内容:
您的首选语言:null
然后几乎立即更新并更改为
您的首选语言:zh
当langlocalStorage中没有项目时,更改为
您的首选语言:fr
在localStorage.setItem("lang", "fr")开发者控制台中明确设置并刷新之后。
我知道,这家店是在服务器上初始化第一地方window是undefined,然后在客户端上复水。因此,此行为是预期的。 …