Svelte:如何等待组件渲染

2024-05-01

我正在制作一个基于套接字连接的简单应用程序。基本上,一个用户决定其他用户可以看到什么。功能之一是为其他用户启动计时器。因此,有一个带有timerState变量和startTimer函数的Timer组件。当用户连接到套接字时,计时器组件与整个用户视图一起呈现。对传入事件“计时器已启动”做出反应非常简单并且工作完美。当计时器已经启动并且用户刷新浏览器时(或者在计时器已经设置时只是晚连接),问题就开始了。 计时器设置的信息存储在数据对象中,该数据对象在初始连接到套接字后作为欢迎事件发送给用户。

为了简化,用户视图的组成如下:

{#if !isDataComplete}
<WaitingComponent>
{:else}
<Timer bind:{tools}>
{/if}

Tools是一个对象,包含一些方法,主要是startTimer方法。

因此,连接后,用户接收数据对象,该数据对象将 wiev 从等待切换到应用程序 wiev(此处:计时器,最初为空,但已渲染)。如果有计时器属性,则意味着已经设置了计时器,并且应该调用 startTimer 方法。但是,startTimer 方法尚无法访问,因为脚本比渲染速度更快,并且计时器组件尚不存在。实际上并没有获取数据,它带有来自套接字的“欢迎”事件,因此等待数据并不能解决问题,我需要等待组件渲染。


    let isDataComplete = false;
    socket.on('welcome', async (incomingData) => {
                isDataComplete = incomingData.isAppReady; // triggers switch view if true 
                await timeout(500); // my "lame solution" (timeout is just setTimeout wrapped in Promise to make that awaitable)
                if (data.timer) {
                    const currTime = Date.now();
                    if (currTime < data.timer.start + data.timer.duration) {
                        const remainingTime = Math.floor(
                            (data.timer.start + data.timer.duration - currTime) /
                                1000
                        );
                        tools.startTimer(remainingTime, true);
                    }
                }
            });

正如您所看到的:我通过在脚本中添加等待 setTimeout 500 毫秒(在调用 startTimer 之前)“解决”了这一问题,这可以解决问题,组件可以渲染并且方法已经可以访问。但不知怎的,我觉得这是蹩脚的解决方案,所以也许有人可以通过其他方式提供帮助?

我只需将计时器组件放在 if 块之外,使其甚至在接收数据之前就进行渲染,但这并不是一个好主意,因为视图结构。

我试图将 setTimer 方法存储在其他地方并导入它,但这会导致从外部管理计时器状态时遇到一些困难。但这当然是一种有效的尝试方法。

多谢! 普热梅克


我相信你想要的是tick功能。来自tick() docs https://svelte.dev/docs#run-time-svelte-tick:

返回一个承诺,一旦应用了任何挂起的状态更改,该承诺就会解决;如果没有,则在下一个微任务中解决。

import { tick } from 'svelte';

有了它你可以插入await tick();您希望代码等待应用所有阶段更改并更新模板。

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

Svelte:如何等待组件渲染 的相关文章

随机推荐

  • 使用 C# 的服务 SACL ||使用 C# 获取具有 ACCESS_SYSTEM_SECURITY 权限的服务的句柄

    有人知道如何使用 C 获取远程服务上的 SACL 吗 我尝试了很多不同的方法 但基本上没有什么效果 我可以在本地计算机上获取 DACL 和 SACL 但在远程计算机上获取其中任何一个似乎都不可能 我所做的是创建一个名为ServiceSecu
  • 如何在 Linux 中检测通过 GUI 登录的用户

    我想在我的程序中捕获通过 GUI 登录的用户名 我的程序作为守护进程从 root 登录运行 如果非 root 用户通过 GUI 登录 我的程序应该会收到通知 我正在粘贴我当前的程序 该程序调用一个 perl 脚本 利用系统调用来检查当前登录
  • 如果尚未打开,请打开工作簿;如果已打开,则获取该引用

    我有一个场景 可以在另一个工作簿路径中的工作簿中进行一些更改 但问题是我需要检查工作簿是否已经打开 如果没有 我需要将该打开的实例获取到工作簿变量 这是我用来检查工作簿是否打开的代码 然后是打开的代码 Function IsFileOpen
  • 如何在Unity中集成xAPI / TinCan

    我是 xAPI TinCan API 的新手 所以我的问题可能有点笼统 但到目前为止我还没有找到任何可以帮助我的东西 我认为可以将 xAPI 集成到 Unity 项目 游戏或模拟 中 但我到底该怎么做呢 我可以阅读有关 xAPI 和 Uni
  • 显示用户密码和设备确认页面

    我试图在 Devise 邮件程序发送的确认页面中显示用户密码 确认页面为默认页面 Welcome email protected cdn cgi l email protection You can confirm your account
  • java.lang.IndexOutOfBoundsException:无效索引 7,大小为 7

    我正在尝试实现视图寻呼机 在我的视图寻呼机图像来自服务器 我能够显示和滚动 但当我到达最后一个图像时 它显示错误并且应用程序崩溃 以下是我的代码片段 public class Test Pager extends Activity priv
  • Electron 为触摸屏启用触摸事件

    我有一个连接到触摸屏的 Raspberry Pi 并通过 startx 命令在其上运行电子应用程序 startx electron app nocursor 我无法处理触摸事件 例如 touchstart touchend 的问题 显然这是
  • java中如何将字符串日期转换为时间戳?

    我想在java中将字符串日期转换为时间戳 我编写了以下编码 我声明 date1 的日期是 7 11 11 12 13 14 SimpleDateFormat datetimeFormatter1 new SimpleDateFormat y
  • Android 动态删除按钮

    我有一个按钮 当我按下它时 我想将其删除 而不是使其不可见 我读到我可以使用layout removeView mybutton 但布局是什么 我怎样才能在我的活动中得到它 Button showQuestion private void
  • findPreference(java.lang.CharSequence) 已弃用

    它给我错误 findPreference java lang CharSequence 已被弃用 目前 我的应用程序的目标是 API 10 及更高版本 任何形式的帮助来解决这个问题将不胜感激 公共类 SettingsActivity 扩展
  • 带有 Form 和 $setPristine 的 Angular 1.5 组件

    我正在尝试在 Angular 1 5 的组件中使用表单 我的表单可以正常工作 因为我有模型绑定并且可以在提交时获取数据 所以我已经完成了 90 的目标 缺少的是能够使用 setPristine 正确重置表单 我尝试了几种方法 第一种方法是将
  • C++ 虚(密封)函数

    我在我的 C 项目中使用 dll 中的类 一切都工作正常 直到 当尝试调用某个方法 在对象浏览器中列出 时 我收到一条错误消息 指出该方法不是命名空间的成员 经过调查 我注意到该方法被列为 virtual void x seal 有没有办法
  • webpack - 如何将捆绑包提取到各个组件

    我想从bundle js 一个webpack文件 中解压 提取所有组件和js文件 我只留下这个文件 我已经用谷歌搜索并尝试了几种方法来解压捆绑js文件 但它没有成功 我也尝试过该解决方案 请查找参考 如何提取Webpack中的bundle
  • 从终端输入缓冲区加载到参数堆栈

    为什么这段代码不起作用 TIB 10 ACCEPT TIB SP 1 cells 10 cmove 在该代码中 我尝试输入一个字符串并将其存储在终端输入缓冲区中 然后将其存储在参数堆栈中 但对于 S 我发现这不起作用 参数堆栈向内存不足方向
  • 这是什么文本选择控件?

    我想在具有各种文本字段的活动上的文本选择上实现相同性质的控制类型 实现图片所示行为的任何想法 参考此来自安卓2 3 http developer android com sdk android 2 3 html文档 您可以使用此方法创建自己
  • 在 Pandas 中计算滚动回归并存储斜率

    我有一些时间序列数据 我想计算 Pandas 中最后 n 天的分组滚动回归 并将该回归的斜率存储在新列中 我搜索了较旧的问题 它们要么没有得到解答 要么使用了 Pandas OLS 我听说它已被弃用 我想我可能可以使用df rolling
  • Azure Web 应用程序中 Docker 中的 Laravel 无法从已安装的文件存储中提供图像

    我有一个 azure web 应用程序 带有一个运行 apache 的自定义容器 带有 laravel 的 php 7 4 和一个安装的 azure 文件存储 从已安装的存储提供 png 文件确实适用于我在 docker 桌面中的本地构建
  • 连接字符串列中的唯一字符

    我有一个 data frame 其中有一个字符串列 city 它由用 分隔的连接字母组成 dt data frame id letters 1 6 city c A B B D A D G A C F G C D dt id city 1
  • 如何在nextjs中安装tailwind元素?

    我正在 nextjs 中为滑块安装顺风元素 但它在 nextjs 中不起作用 有任何解决方案可以轻松安装它 我遵循这个方法 1 1 https tailwind elements com quick start 当我添加此导入 tw ele
  • Svelte:如何等待组件渲染

    我正在制作一个基于套接字连接的简单应用程序 基本上 一个用户决定其他用户可以看到什么 功能之一是为其他用户启动计时器 因此 有一个带有timerState变量和startTimer函数的Timer组件 当用户连接到套接字时 计时器组件与整个