【问题标题】:SvelteKit loading indicator when a page load time threshold is exceeded超过页面加载时间阈值时的 SvelteKit 加载指示器
【发布时间】:2022-01-10 00:59:46
【问题描述】:

我正在将 SvelteKit 用于主要是服务器端呈现页面的网站。 SvelteKit 上的客户端导航效果很好,而且超级活泼。但是,有时在路由load()函数中调用后端服务器时,由于数据库长尾延迟,响应不是即时的,可能是几秒钟。

创建仅在加载时间不是即时(低于 200 毫秒)时才显示的加载指示器的最佳方法是什么?我知道通用的navigating 模式,但我特别希望创建一个加载指示器,除非页面加载不是即时的,否则不会触发。

【问题讨论】:

    标签: sveltekit


    【解决方案1】:

    Sveltekit 有一个名为“navigating”的存储变量,它从字面上指示客户端是否在加载页面之间。来自Sveltekit docs:

    navigating 是一个可读存储。导航开始时,其值为{ from, to },其中from 和to 都反映了页面存储值。什么时候 navigating 结束,其值恢复为 null。

    请注意,如果您的页面是预渲染的,它应该是“即时的”,因此不会显示加载指示器。如果不是,只要您的内容被获取和/或呈现,这个“导航”变量就不会为空。如果您愿意,您可以让“Spinner”组件不显示任何内容...直到 200 毫秒后(使用 setTimout 计时器)...听起来您确实想要。

    这是我过去使用的包装器组件的示例实现(请原谅 tailwindcss 语法...我复制并粘贴了它)。您可以在 __layout.svelte 中自定义此想法,或者使用此 {#if $navigating} 逻辑包装组件或整个“页面”:

    <script>
    // USE THIS:
    import { navigating } from '$app/stores'
    // Example spinner/loading component is visible (when $navigating != null):
    import Spinner from '$lib/design/Spinner.svelte'
    ...
    </script>
    
      <main class="py-4">
        <div class="pagePaddingMain flex-col">
          {#if title}
            <h1 class="text-4xl text-center text-cText pb-4 sm:text-5xl">{title}</h1>
          {/if}
          {#if $navigating} <!-- LOOK HERE -->
            <div class="m-8">
              <Spinner />
              <h1 class="ext-3xl text-center text-cText">Fetching {title}...</h1>
            </div>
          {:else}
            <slot />
          {/if}
        </div>
      </main>
    

    就是这样。祝你好运!

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2012-03-01
    • 2011-06-03
    • 1970-01-01
    • 2011-11-21
    相关资源
    最近更新 更多