如何同步倒计时计时器,在两个单独的选项卡中有相同的链接



我想知道是否有办法将反应倒计时计时器同步到两个不同的选项卡,如下所示:

1:46||1:52
第一个选项卡||第二个选项卡

感谢

一般意义上的倒计时

通常,通过选择计时器将达到零的到期时间来定义倒计时计时器。相对倒计时计时器将使用基于当前时间的计算来定义到期时间。换言之,设置一个定时器;10秒后";其中now被定义为用户单击开始按钮的时刻,可以使用这样的代码:

// In the start button's click handler
due = Date.now() + 120000 // 120000 is 2 minutes (120 s) expressed in milliseconds

单击按钮时会对其进行评估。如果您再次单击该按钮,将重新计算到期时间,并且到期时间将从您单击该按钮的那一刻起移动到未来10秒后的某一时刻。换句话说,程序将再次评估Date.now(),并在此基础上选择新的到期时间。

现在要计算,在给定的时刻还有多少时间,你可以使用以下计算:

remaining = due - Date.now()
// `remaining` contains number of milliseconds remaining until our countdown is due

在定时器到期之前的时刻,这将是一个正数,如果在定时器到期之后进行评估,则将是负数。而且,如果你碰巧真的很幸运,你可能会在到期的那一刻抓住它,remaining将恰好为零。

通常,倒计时计时器会定期更新(更改其显示的值(,至少每秒一次,尽管可能频率更高(可能显示剩余的十分之一秒,甚至毫秒(,也可能频率更低(您可以选择每分钟只更新一次显示(。

要更新显示,您需要在客户端中使用JavaScript间隔计时器。这个定时器的频率只是控制你想要更新显示的频率,而与它的到期时间或显示剩余时间的精度无关(即,你是显示"剩余2分钟"还是"剩余2点"或"剩余2小时"(,精确显示您可以每秒更新60次(大约是典型显示器的刷新率(,或者如果您的显示精度仅为秒,根据应用程序的不同,每秒更新10次可能就足够了。

示例:

setInterval(() => {
display(`${due - Date.now()} ms remaining`);
}, updateInterval);

display可以只是console.log,或者用于更改DOM元素文本的代码,也可以是ReactsetState。取决于您的申请。CCD_ 6可能是250以适度的每秒4次进行更新。

真实故事:我有一个纸质挂历,但我不会在午夜翻动每月的一页。事实上,有时我直到月的第二天或第三天才把它翻过来,但我通常会";轮询";每两三天更新一次,看看是否需要更新。我不会为了更改日历而设置闹钟在午夜叫醒我。一般来说,每天检查一次对我来说已经足够了。倒计时计时器也一样。

同步

要使两个倒计时计时器同步,它们必须基于相同的到期时间。而且两者都应该足够频繁地更新,这样你就不会因为显示过时而注意到任何差异。

如果你在同一台计算机上有两个应该同步的浏览器选项卡,那么只要告诉两个选项卡中的应用程序相同的到期时间就足够了。每个选项卡都可以通过Date.now()访问相同的系统时间。因此,每个人都可以通过计算due - Date.now()来显示到到期时间还有多少时间。

至于你的React倒计时计时器,我相信有一种方法可以将到期时间设置为JavaScript日期。只要确保服务器向两个选项卡发送相同的到期时间,并且每个选项卡何时加载并启动倒计时计时器并不重要,因为客户端不会为基于Date.now()的倒计时计时器的本地显示分配到期日期值,它将显式地从服务器接收到期时间。

关键是由服务器为计时器提供到期时间。两个预定同时达到0的倒计时计时器实际上是相同的逻辑。如果以合理的频率保持最新,则显示将显示为合理同步。

请小心使用UTC将日期传输到客户端,这样就不会出现由于服务器和客户端之间的时区差异而导致的问题。


如果您需要帮助对React倒计时计时器进行编程,以将其设置为特定的到期日,那么您应该披露您正在使用的库/组件,并显示如何设置计时器的代码。

相关内容

  • 没有找到相关文章

最新更新