如何使用钩子更新 SolidJS 中的本地存储值

2023-12-09

我正在尝试为solid-js 制作一个自定义“钩子”,它将从本地存储中检索状态。

import { Accessor, createSignal, Setter } from "solid-js";

export default function createLocalStorageSignal<T extends string>(key: string): [get: Accessor<T>, set: Setter<T>] {
    const storage = window.localStorage;
    const initialValue: T = JSON.parse(storage.getItem(key) ?? '{}').value;

    const [value,setValue] = createSignal<T>(initialValue);

    const newSetValue: Setter<T> = (newValue) => {
            setValue(newValue);
            storage.setItem(key, JSON.stringify({value: newValue}));

            return newValue;
        }

    return [
        value,
        newSetValue
    ]
}

但是我收到类型错误

Type '(newValue: any) => void' is not assignable to type 'Setter<T>'

为什么不能推断 newValue 的类型?如果无法推断,我应该将其设置为什么?

EDIT: Setter<T>的完整类型是

type Setter<T> = undefined extends T ? 
    <U extends T>
        (v?: (U extends Function ? never : U) |
        ((prev?: T | undefined) => U) | undefined) => U : 
    <U extends T>
        (v: (U extends Function ? never : U) |
        ((prev: T) => U)) => U

我不太明白其目的U类型及其工作原理。我认为问题与 newValue 可能是一个函数但 T 类型也可能是一个函数类型或其他东西有关......


建立在trusktr 的回答,简化setValue包装函数并添加参数defaultValue and storage(所以你可以使用sessionStorage如果你想):

function createStoredSignal<T>(
   key: string, 
   defaultValue: T, 
   storage = localStorage
): Signal<T> {

  const initialValue = storage.getItem(key) 
    ? JSON.parse(storage.getItem(key)) as T 
    : defaultValue;

  const [value, setValue] = createSignal<T>(initialValue);

  const setValueAndStore = ((arg) => {
    const v = setValue(arg);
    storage.setItem(key, JSON.stringify(v));
    return v;
  }) as typeof setValue;

  return [value, setValueAndStore];
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用钩子更新 SolidJS 中的本地存储值 的相关文章

随机推荐

  • 使用 AlternateView 生成 HTML 电子邮件的正确语法

    我正在尝试使用AlternateView以满足 HTML 和文本客户端的需求 我更喜欢使用 HTML 并且仅在必要时才使用文本 我开始重新编码一个旧的控制台应用程序来执行此操作 但我的代码中仍然有回车符和换行符作为 r n 我的问题是试图弄
  • Excel CustomUI 功能区布局

    我正在尝试为 Excel 创建一个自定义功能区 其中包含如下图所示的组 2 行按钮 下面有一个下拉框 我开始认为这不能完全按照我想要的方式完成 我尝试了几种不同的方法 其中之一如下 但它们都产生相同的输出 3 列 2x2 按钮 下拉框位于第
  • Screen命令禁用控制键ctrl-a以在vim中使用它?

    我有时使用 screen linux 命令打开 vim 但由于 ctrl a 被视为控制键 我无法在编辑器中使用相同的组合来增加数字 我不想完全重新映射 ctrl a 但有没有办法禁用它以便我可以在 vim 中使用它 In screen 您
  • 消耗不重叠的向量块,并组合结果

    我试图通过使用线程来加速大向量上昂贵的计算 我的函数使用一个向量 计算一个新值向量 它不会聚合 但必须保留输入顺序 然 后返回它 然而 我正在努力弄清楚如何生成线程 为每个线程分配向量切片 然后收集并组合结果 tunable const N
  • SpringBoot 2.1.0 尝试集成数据库访问时抛出 ClassNotFoundException

    我有一个简单的SpringBoot 2 1 0应用程序并尝试添加数据库连接JPA 一切都设置为 spring boot starter data jpa 依赖于pom xml 但是当我启动应用程序时 我得到了这个ClassNotFoundE
  • 如果使用 jquery 的 .each() 函数迭代每个表单元素后验证失败,则阻止表单提交

    我有以下代码 其中我尝试迭代 html 文本输入元素 进行一些验证并在验证失败时阻止表单提交 the form submit function text this each function if this val length 0 var
  • 什么是网络中的骨架?

    在 J2EE 应用程序中 客户端 应用程序 JSP servlet JavaBeans 通过以下方式访问实体bean 他们的远程接口 因此 每一个 客户端调用可能路由 通过网络存根和骨架 即使客户和企业 bean 位于相同的 JVM 操作系
  • 从 Web 作业运行 Azure PowerShell 命令

    Update 我按照下面 BenV 的建议使用了 Azure 自动化 并且成功了 更多信息可以找到here 我有一个 PowerShell 脚本 需要运行一些 Azure 命令 例如New AzureStorageContext Get A
  • 正则表达式提取子字符串,由于某种原因返回 2 个结果

    我需要在 javascript 中做很多正则表达式的事情 但我在语法上遇到了一些问题 而且我似乎无法找到关于此的明确资源 出于某种原因 当我这样做时 var tesst afskfsd33j var test tesst match a j
  • EF7 beta6:保存多个实体时出错

    我正在使用 ASP NET5 和 Entity Framework 7 0 0 beta 6 创建 API 当我尝试在多个请求中执行各种更新时 出现以下异常 无法跟踪 公司 因为已跟踪具有相同密钥的该类型的另一个实例 对于新实体 请考虑使用
  • 结构变量不变

    我觉得我错过了一些完全明显的东西 所以如果 什么时候 是这种情况 我提前道歉 我正在尝试做一些非常简单的事情 将结构中的 bool 值从 false 更改为 true 显然我无法直接更改它 因此我在结构中创建了一个可以调用的方法 该方法应该
  • Gradle:无法生成 QueryDSL 类

    摇篮版本 5 1 Java版本 11 我在中定义了以下任务gradle要生成的文件QueryDSL课程 task generateQClasses type JavaCompile source sourceSets main java s
  • Youtube API v3 每个请求都算作 300 个请求 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我的应用程序突然开始出现错误 超出每日限制 然后我查看了请求数 发现每1个请求算作300个请求 怎么了 此问题在过去 24 小时左右存在 Look at the Pictur
  • Elixir Hound 等待页面加载

    我正在提交一个登录表单 然后尝试使用 Elixir hound 捕获 HTML 提交后我运行page source却一无所获 如果我等待一秒钟 页面完成加载 我就会返回 html 有没有办法让猎犬等待页面加载完成 我目前正在做 timer
  • 识别 JSON 属性的唯一性[重复]

    这个问题在这里已经有答案了 运行查询我得到如下响应 results data row Name name1 row
  • 链接在浏览器中消失

    您能帮忙解决一下这个问题吗 a target self href http reversevincheck com hop asdas price type tid asda img src http reversevincheck com
  • 在本地存储中保存 JavaScript 数据的最佳方法

    我希望能够创建 JavaScript 注释对象并使用导航栏窗格动态删除它们 var sel window getSelection var range sel getRangeAt 0 var editor startContainer r
  • Rust 常量表达式可以使用像 Def​​ault 这样的特征吗?

    这段代码给出了一个错误 derive Default struct A b Option lt gt c Option lt gt const a A A b None Default default error E0015 calls i
  • jqGrid表单编辑,HTML代替表单字段中的值

    我在用表单编辑 and 内联编辑在我的网格中 jqGrid 4 5 2 当我有一个可编辑列然后打开表单时 我确实看到了 HTML 代码而不是值 屏幕截图显示了我的意思 如果相应行中没有可编辑的字段 则一切正常 我在某处读过 我不会使用For
  • 如何使用钩子更新 SolidJS 中的本地存储值

    我正在尝试为solid js 制作一个自定义 钩子 它将从本地存储中检索状态 import Accessor createSignal Setter from solid js export default function createL