设置储值的 Svelte 用户注册问题

2024-01-09

helo :)

我正在尝试注册用户,成功后将 setContext 设置为新注册的用户,然后导航到主页。服务器正确响应并注册用户,但是当调用 setContext 时,我收到以下错误:“index.mjs:552 Uncaught(在承诺中)错误:在组件初始化之外调用的函数”

    <script>
    import { setContext } from 'svelte'

    async function handleRegistration(e) {
        let user = {
                    firstname: e.target.firstname.value,
                    lastname: e.target.lastname.value,
                }

                fetch('http://localhost:3001/api/auth/register', {
                    method: 'POST',
                    headers: {'Content-Type':'application/json'},
                    body: JSON.stringify(user)
                })
                .then(res => res.json())
                .then(res => {
                    if(res.accessToken) {
                        user.accessToken = res.accessToken
                        user.refreshToken = res.refreshToken
                        setContext('userData', user)
                        navigate("/", { replace: true })
                    }
                })

                updateContext(user)
            }
    }
</script>

<form class="registration" on:submit|preventDefault="{handleRegistration}">
</form>

我究竟做错了什么?


setContext必须在组件初始化期间同步调用。也就是说,从根<script> tag:

<script>
  import { setContext } from 'svelte'

  console.log('init')

  setContext(...) // OK

  setTimeout(() => {
    setContext(...) // Not OK (we're not synchronous anymore)
  }, 0)
<script>

<h1>My Svelte Component</h1>

这篇文章中的一个神秘的小句子提到了这一点docs https://svelte.dev/docs#setContext:

与生命周期函数一样,必须在组件初始化期间调用它。

其他生命周期函数有onMount, onDestroy等等。可以说不太明显的是setContext就是这样一个生命周期方法。

Edit

我刚刚重读了你的问题,发现这实际上只回答了一半......

setContext / getContext只能在组件初始化时使用一次,那么如何通过上下文共享 API 结果呢?相关:如果调用是在 Svelte 组件外部进行的,您将如何共享这些 API 结果,其中setContext更不可能(而且 API 调用可能会更好定位,因为关注点分离问题)?

说得好a store在你的情况下。

例如,对于可写存储:

<script>
  import { getContext } from 'svelte'

  const userData = getContext('userData')

  function handleRegistration(e) {
    doSuperApiCall()
      .then(data => {
        userData.set(data)
        // or fancy:
        $userData = data
      })
      .catch(...)
  }
</script>
...

在某些更高包装组件的初始化期间将此存储放入上下文中(例如<App>):

<script>
  import { setContext } from 'svelte'
  import { writable } from 'svelte/store'

  const userData = writable(null)

  setContext('userData', userData)
</script>

<slot />

这样您就可以轻松访问您的商店getContext来自(例如)的任何子组件<App>,并异步读取/写入。

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

设置储值的 Svelte 用户注册问题 的相关文章

随机推荐

  • 如何通过 Flutter web 直接发送电子邮件

    我正在构建一个 flutter web 我必须通过电子邮件将表单数据发送到我的 Gmail 电子邮件地址 我该怎么办 请帮我 我有用户 mailer 3 0 4 和 flutter email sender 2 2 2 但他们都没有工作 这
  • 在 Java 中什么时候适合使用引用相等与对象相等?

    我了解这两个术语之间的区别 以及如果您想检查两个对象是否具有引用或相同的值 您将使用什么方法 我的问题是 什么时候你必须检查两个对象是否具有相同的引用 而不是检查两个对象是否具有相同的内容或值 从来没有一次我必须检查两个对象是否具有相同的引
  • 未找到 ID 为“osgi”的插件

    我正在尝试建立一个项目 https github com fge btf https github com fge btf 本地使用 gradle 有一个插件 osgi 正在使用 但每当我构建它时 我都会收到错误插件未找到 我尝试过提供不同
  • 如何从gradle Android Studio中的jar文件中删除单个模块

    如何从 jar 文件中删除单个包 我有两个来自不同供应商的 SDK 并且两个 SDK 都有谷歌 gson包包含在 jar 文件中 因为这导致我在 android studio 中运行构建时出现问题 它显示下图中的错误 我知道如何从存储库中排
  • formControlName 和 FormControl 有什么区别?

    我在用着ReactiveFormsModuleAngular2 创建一个包含表单的组件 这是我的代码 foo component ts constructor fb FormBuilder this myForm fb group full
  • 如何完成有关 Oracle 触发器的练习

    我必须解决这个关于触发器的练习 考虑以下用于表示的关系数据库模式 项目信息 人员 身份证 姓氏 姓名 国籍 项目 姓名 经理 起始年份 参与人数 国际 人员 项目 人员 ID 指定Oracle中需要的触发器来维护以下内容 完整性约束 a 参
  • 异步方法的事件订阅

    我想启动LoadDataAsync有两种方式 首先通过订阅的事件FormLoad 并通过经典方法ManualLoad 但我无法让它发挥作用 我无法在任务返回时进行订阅 和void这是有效的 但是与void can t await in th
  • 在 Windows 中使用 TortoiseSVN 设置 SVN:Externals

    我正在尝试设置svn externals在 Windows 机器上使用 TortoiseSVN 我有两个项目 两个存储库都已在同一台本地计算机上创建 当前的结构如下所示 我创建repoA repoB对于存储库和workA and workB
  • MongoDB 2.4 的“更新后限制数组中的元素数量”使用 C# 驱动程序?

    MongoDB 2 4 添加了一个新的 更新后限制数组中的元素数量 功能 http docs mongodb org manual tutorial limit number of elements in updated array 这是通
  • 我可以使用 Chrome DevTools 在客户端查看会话状态值吗?

    我只是好奇我们是否可以使用 Chrome DevTools 获取 查看网站的会话变量值 如果有人知道 请分享 不可以 您无法在客户端查看会话状态变量 Session状态存储在服务器端 客户端浏览器只知道SessionID存储在 cookie
  • 使用 JavaScript 更改 SVG 对象的高度和宽度

    我想在单击按钮时更改 svg 对象的高度和宽度 我尝试过但它不起作用 function modify document getElementById circle1 style height 10px document getElement
  • 展开宏中的宏

    给定以下宏 以函数调用方式访问编译器属性 例如spec section mysection void foo void define spec H spec H define spec section S attribute section
  • Java 中判断一个数是否为 Double

    我是 Java 新手 我试图弄清楚一个数字是否是 Double 如下所示 if typeof items elementAt 1 Double sum add i items elementAt 1 如果有人能告诉我如何重新排列语法以使其正
  • 使用正则表达式将字符串拆分为单词数组

    我正在尝试将字符串拆分为单词数组 但是我想在每个单词后面保留空格 这就是我正在尝试的 var re a z s gi var test test one two three four var results test match re 我期
  • 获取 Sitecore 中单个页面的个人资料关键分数

    我有关于 Sitecore Analytics 和用户个人资料密钥的问题 我需要能够获取单个页面的配置文件密钥的分数 例如 如果我有一个名为 traveler 的个人资料键 该键在给定页面上的值为 1 10 那么我需要能够获取内容作者分配的
  • messageBox.Show() 执行什么操作才能停止 UI 线程的执行?

    在 WPF 应用程序中 我将消息输出到文本框 并在这些消息之间调用一个设置仪器的函数 但是 这些消息都会同时出现 在函数调用结束时 我真的不知道如何清楚地解释我的问题 我会尽力 我有一个 WPF 应用程序 它使用串行端口从仪器获取数据 该应
  • 如何从祖父母标签继承CSS? [复制]

    这个问题在这里已经有答案了 我有一个两级嵌套的 div 我想应用包含类 c 的 div 其宽度与类 a 的 div 相同 如果它是父母 那么我想继承会完成这项工作 但这种情况下该怎么办呢 HTML 代码 div class a div cl
  • 如何将 Cassandra (>2.0) JVM 堆大小设置为 8GB?

    如何将 Cassandra gt 2 0 JVM 堆大小设置为 8GB 当我输入时free m它给了我以下内容 如何将 Cassandra JVM 堆大小设置为 8GB total used free shared buffers cach
  • 重命名 Pandas DataFrame 索引

    我有一个没有标题 带有日期时间索引的 csv 文件 我想重命名索引和列名 但使用 df rename 仅重命名列名 漏洞 我的版本是0 12 0 In 2 df pd read csv r D Data DataTimeSeries csv
  • 设置储值的 Svelte 用户注册问题

    helo 我正在尝试注册用户 成功后将 setContext 设置为新注册的用户 然后导航到主页 服务器正确响应并注册用户 但是当调用 setContext 时 我收到以下错误 index mjs 552 Uncaught 在承诺中 错误