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

Svelte中如何简便继承sveltestrap组件并保留原有属性?

Svelte 组件二次封装实现方案

Svelte 原生支持对现有组件做继承式二次封装,你写的基础逻辑已经实现了loading态切换内容的核心效果,只需要补全属性、事件透传逻辑,就能完整保留原sveltestrap Button组件的所有配置能力。

你当前代码的核心问题是没有做属性和事件透传:外部传入的sveltestrap Button原生配置(比如color、size、outline、点击事件等)不会自动落到内部的Button组件上,相当于外层组件把这些参数拦截了。


修正后可直接使用的封装代码

<script lang="ts">
    import { Button, Spinner } from 'sveltestrap';
    // 自定义新增的loading参数
    export let loading = false;
</script>

<Button
    {...$$restProps}
    disabled={loading || $$restProps.disabled}
    on:*
>
    {#if loading}
        <Spinner size="sm" class="me-2" />
    {/if}
    <slot />
</Button>

关键实现说明

  • {...$$restProps} 会接收所有没有通过export let显式声明的外部传入参数,直接展开传给内部Button组件,不需要手动逐个声明原组件的所有配置项,后续sveltestrap升级新增Button属性也能自动兼容。
  • on:*是Svelte的批量事件转发语法,原Button抛出的所有事件(点击、聚焦、失焦等)都会直接向外传递,外部给封装组件绑定事件的写法和直接用原Button完全一致。
  • disabled={loading || $$restProps.disabled}是通用体验优化:加载状态自动禁用按钮避免重复点击,同时保留外部手动传入disabled属性的控制能力。
  • 代码里给Spinner加了小尺寸和右侧边距是通用排版优化,你可以根据自己项目的样式需求调整;如果需要loading状态下完全隐藏按钮文字只显示加载动画,把<slot />移回{:else}块即可。

内容的提问来源于stack exchange,提问作者Chase R Lewis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:51:24