javascript - 如何在 Sapper 中持久化 UI 组件状态数据?
问题描述
在 Sapper 应用程序中,我希望能够保持某些 UI 组件的状态,以便在用户返回使用这些组件的页面时导航应用程序而不会丢失状态。
在仅 Svelte 的应用程序中,这通常通过使用sessionStorage
或localStorage
API 的自定义商店来完成。一个很好的例子可以在 R. Mark Volkmann 的书Svelte and Sapper in Action §6.24 中找到:
store-util.js
import {writable} from 'svelte/store';
function persist(key, value) {
sessionStorage.setItem(key, JSON.stringify(value));
}
export function writableSession(key, initialValue) {
const sessionValue = JSON.parse(sessionStorage.getItem(key));
if (!sessionValue) persist(key, initialValue);
const store = writable(sessionValue || initialValue);
store.subscribe(value => persist(key, value));
return store;
}
不幸的是,在 Sapper 中以这种方式使用存储会立即中断,因为脚本首先在服务器上运行,其中sessionStorage
未定义。有一些方法可以防止某些部分代码在服务器上运行(使用onMount
组件中的生命周期函数,或检查process.browser === true
),但这在这里似乎是不可能的。
在本地保持一些状态看起来是一个非常常见的用例,所以我想知道在 Sapper 应用程序中正确的方法是什么(考虑到我什至没有找到错误的方法)。
解决方案
为 SSR 提供一个虚拟存储。
总是可以使用类似的东西进行特征检测typeof localStorage !== 'undefined'
。
即使页面是 SSR 的,您的组件代码也会在浏览器中重新运行。这意味着如果它被提供给不同的存储,则仅浏览器的值将接管并更新现有状态(从服务器继承)。
有关示例,请参见此答案。
推荐阅读
- swift - 我应该将 UI 相关移动到单独类中的扩展中吗?
- excel - Máximo número de palabras, elegidas de los archivos de unacarpa
- python - python - 如何在python中使用numpy将文件中的数据加载为数组?
- javascript - 自动完成不更新选项,但新数组在 hits 属性中可用
- sql - 通过文本数组中的任何值在文本数组中搜索 Postgres sql
- refactoring - 为什么我不能将部分框定义移动到本地绑定中?
- android - 图像和视频的 getItemViewType
- oracle - 我需要为备用或仅安装 oracle 软件安装 oracle 数据库吗?
- python-3.x - 在服务器上的会话结束后查看 Flask App 的终端日志,但应用程序仍在后台运行
- node.js - 如何使用节点读取在 Firestore 中创建的最新文档?