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

如何在SvelteKit组件中使用异步函数的返回值作为Props

在SvelteKit TypeScript组件中传递异步数据作为Props的正确方式

错误原因分析

直接调用异步函数readUsernameFromDatabase会返回Promise对象,而非实际的用户名字符串,组件接收的props会是Promise,无法正常使用。

解决方案

方案1:页面组件用Load函数预获取数据(SvelteKit推荐)

如果是页面组件,优先通过+page.ts的load函数提前获取异步数据,再传递给组件:

+page.ts:

import type { PageLoad } from './$types';
import { userStore } from '$lib/stores';
import { readUsernameFromDatabase } from '$lib/db';
import { get } from 'svelte/store';

export const load: PageLoad = async () => {
  const user = get(userStore);
  // 等待异步函数返回结果
  const username = await readUsernameFromDatabase(user.uid);
  return { username };
};

+page.svelte:

<script lang="ts">
  import UsernameField from '$lib/components/UsernameField.svelte';
  // 接收load函数返回的username
  export let username: string;
</script>

<!-- 直接传递已解析的字符串 -->
<UsernameField {username} />

方案2:普通组件用{#await}块处理异步请求

如果是嵌套组件,无法使用load函数,可通过响应式声明结合{#await}块处理异步结果:

<script lang="ts">
  import { userStore } from '$lib/stores';
  import UsernameField from '$lib/components/UsernameField.svelte';
  import { readUsernameFromDatabase } from '$lib/db';

  // 当uid变化时,重新发起请求
  $: usernamePromise = $userStore.uid ? readUsernameFromDatabase($userStore.uid) : null;
</script>

{#if usernamePromise}
  {#await usernamePromise}
    <p>加载用户名中...</p>
  {:then username}
    <!-- 拿到实际值后再传递给组件 -->
    <UsernameField {username} />
  {:catch error}
    <p>加载失败:{error.message}</p>
  {/await}
{:else}
  <p>未获取到用户ID</p>
{/if}

方案3:Svelte 4+ 用$await简化语法

Svelte 4及以上支持$await语法,可更简洁地处理Promise:

<script lang="ts">
  import { userStore } from '$lib/stores';
  import UsernameField from '$lib/components/UsernameField.svelte';
  import { readUsernameFromDatabase } from '$lib/db';

  $: usernamePromise = $userStore.uid ? readUsernameFromDatabase($userStore.uid) : null;
</script>

{#await $usernamePromise}
  <p>加载中...</p>
{:then username}
  <UsernameField {username} />
{:catch err}
  <p>加载出错:{err}</p>
{/await}

组件Props类型定义

确保UsernameField组件的props类型正确:

<script lang="ts">
  // 明确声明props类型
  export let username: string;
</script>

<input type="text" value={username} readonly />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:32:49