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

如何改造Svelte项目中现有Chip组件以实现高效复用

可复用Chip组件改造方案

核心问题:原有组件硬绑定了项目专属的redirectUris全局store,且删除逻辑内聚在组件内部,无法适配不同数据源场景。

Chip组件示例1
Chip组件示例2

改造后的Chips组件代码

<script>
import close from '../../asset/icon/tip/close.svg';
import { createEventDispatcher } from 'svelte';

// 对外暴露props,接收父组件传入的标签列表
export let labels = [];
const dispatch = createEventDispatcher();
</script>

<div class="chips">
  {#each labels as uri, index}
    <div class="chip">
      <p class="chip-name">{uri}</p>
      <button
        on:click={() => {
          console.log(uri);
          // 抛出删除事件,将下标和当前值传递给父组件
          dispatch('remove', { index, value: uri });
          console.log(labels);
        }}>
        <img src={close} alt="关闭" />
      </button>
    </div>
  {/each}
</div>

<!-- 原有chips、chip类的样式代码保留即可,无需修改 -->

父组件调用方式

完全符合你期望的简便调用逻辑,只需额外监听删除事件处理数据源更新即可:

<script>
import Chips from './Chips.svelte';
let labels = ["foo", "bar"];

// 处理删除事件
function handleRemove(e) {
  const { index } = e.detail;
  labels.splice(index, 1);
  // Svelte数组修改后需要重新赋值触发响应式更新
  labels = labels;
}
</script>

<Chips {labels} on:remove={handleRemove} />

可选扩展优化

如果需要适配更多场景,可以按需扩展props:

  • 新增export let showDelete = true,控制是否渲染删除按钮,适配仅展示的场景
  • 新增export let displayField = '',如果传入的labels是对象数组,可以指定要显示的字段
  • 新增export let customClass = '',支持自定义外层容器样式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:15:03