You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Svelte中load函数获取数据时,如何渲染等待状态或非依赖标记?

实现SvelteKit页面加载状态的方案

完全可以实现你想要的效果,核心是让+page.js返回未解析的Promise,配合+page.svelte的{#await}块来处理加载状态,具体步骤如下:

1. 调整+page.js代码

你的现有代码已经接近正确,但要确保不awaitfetchAllData的调用,这样返回的data是一个未完成的Promise,SvelteKit会立即渲染页面,同时在后台等待数据加载完成:

import { fetchAllData } from '$lib/utils';

export async function load({ fetch, url }) {
    const id = url.searchParams.get('id');
    // 直接返回Promise,不等待解析
    const data = fetchAllData(id, fetch);
    return { data };
}

注意:如果fetchAllData本身不是异步函数(不返回Promise),需要先将其改造为异步逻辑,否则无法用{#await}处理。

2. 在+page.svelte中实现加载状态

你的示例代码思路正确,还可以补充错误处理逻辑,同时提前渲染不依赖数据的内容:

<script>
    export let data;
</script>

<!-- 先渲染不需要等待数据的内容 -->
<header>
    <h1>数据详情页</h1>
    <nav>
        <a href="/">返回首页</a>
    </nav>
</header>

<!-- 根据Promise状态切换显示内容 -->
{#await data}
    <div class="loading">
        <p>正在获取数据,请稍候...</p>
        <!-- 可以添加加载动画 -->
    </div>
{:then d}
    <main>
        <!-- 渲染加载完成的数据 -->
        <p>数据内容:{JSON.stringify(d)}</p>
    </main>
{:catch err}
    <div class="error">
        <p>数据加载失败:{err.message}</p>
    </div>
{/await}

原理说明

当load函数返回包含Promise的对象时,SvelteKit不会阻塞页面渲染,而是先渲染页面中不依赖该Promise的部分,同时在后台等待Promise完成。页面中的{#await}块会自动监听Promise的状态变化,依次显示等待、成功、错误三种状态对应的内容。

内容的提问来源于stack exchange,提问作者Lenn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 10:17:13