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

如何在Svelte同页面用代码片段传递子内容并避免重复代码?

在Svelte同文件内提取带过渡的重复div(无需独立组件)

方案1:使用带渲染函数参数的Snippet(推荐)

你可以让contentTransition snippet接收一个返回Snippet的函数,直接在调用时动态渲染组件并传递参数,完全不需要额外包装组件到单独的snippet中:

{#snippet contentTransition(renderer: () => Snippet)}
    <div transition:fade onoutrostart={takeOutOfStaticFlow}>
        {@render renderer()}
    </div>
{/snippet}

{#await dataPromise}
    <!-- 直接传递渲染加载组件的箭头函数 -->
    {@render contentTransition(() => <CustomDataLoadingProgressComponent />)}
{:then data}
    <!-- 动态传递data参数给数据表格组件 -->
    {@render contentTransition(() => <CustomDataTableComponent data={data} />)}
{/await}

优势:

  • 完全避免冗余的snippet包装(不用单独定义dataLoadingProgress/dataTable)
  • 调用时直接处理组件传参,逻辑清晰
  • 所有代码保留在当前文件内

方案2:在同文件内定义微型本地组件

如果更习惯组件的slot语法,可以在当前文件的<script>中定义一个仅本地使用的微型组件,无需创建独立文件:

<script>
    import { fade } from 'svelte/transition';
    import CustomDataLoadingProgressComponent from './path/to/your/component';
    import CustomDataTableComponent from './path/to/your/component';

    function takeOutOfStaticFlow() {
        // 你的逻辑代码
    }

    // 定义本地组件,仅当前文件可用
    const ContentTransition = {
        props: ['children'],
        template: `
            <div transition:fade onoutrostart={takeOutOfStaticFlow}>
                {@render children}
            </div>
        `,
        exports: { takeOutOfStaticFlow }
    };
</script>

{#await dataPromise}
    <ContentTransition>
        <CustomDataLoadingProgressComponent />
    </ContentTransition>
{:then data}
    <ContentTransition>
        <CustomDataTableComponent data={data} />
    </ContentTransition>
{/await}

优势:

  • 使用熟悉的组件slot语法,可读性高
  • 组件逻辑完全封装在当前文件内,不会污染全局

方案3:利用{@render}与匿名Snippet(简化版)

如果不想写箭头函数,也可以直接在调用时定义匿名snippet:

{#snippet contentTransition(childSnippet: Snippet)}
    <div transition:fade onoutrostart={takeOutOfStaticFlow}>
        {@render childSnippet}
    </div>
{/snippet}

{#await dataPromise}
    {@render contentTransition(() => {
        {#snippet()}
            <CustomDataLoadingProgressComponent />
        {/snippet}
    })}
{:then data}
    {@render contentTransition(() => {
        {#snippet()}
            <CustomDataTableComponent data={data} />
        {/snippet}
    })}
{/await}

这个方案相比方案1稍显繁琐,推荐优先使用方案1。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:54:55