7021f2fd创建于 2025年5月14日历史提交
<template>
  <div class="breadcrumb">
    <template v-for="(item, index) in items" :key="index">
      <span
        class="breadcrumb-item"
        :class="{ 'is-link': index < items.length - 1 }"
        @click="handleClick(item, index)"
      >
        <slot :name="'item-' + index" :item="item">
          {{ item.title }}
        </slot>
      </span>
      <span v-if="index < items.length - 1" class="breadcrumb-separator">{{ separator }}</span>
    </template>
  </div>
</template>

<script setup lang="ts">
defineOptions({
  name: 'Breadcrumb',
})

interface BreadcrumbItem {
  title: string
  [key: string]: any
}

const props = defineProps({
  items: {
    type: Array as PropType<BreadcrumbItem[]>,
    default: () => [],
  },
  separator: {
    type: String,
    default: '/',
  },
})

const emit = defineEmits(['click'])
const handleClick = (item: BreadcrumbItem, index: number) => {
  if (index < props.items.length - 1) {
    emit('click', item, index)
  }
}
</script>

<style lang="scss" scoped>
.breadcrumb {
  display: flex;
  align-items: center;
  font-size: 14px;
  line-height: 1.5;
  padding: 8px;
  &-item {
    &.is-link {
      color: rgba(0, 0, 0, 0.45);
      cursor: pointer;
      transition: color 0.3s;
    }
    &:last-child {
      color: rgba(0, 0, 0, 0.75);
    }
  }
  &-separator {
    margin: 0 8px;
    color: rgba(0, 0, 0, 0.45);
  }
}
</style>