【Vue3】面包屑组件封装

文章介绍了如何在Vue.js中封装一个面包屑组件,通过provide/inject进行数据传递,使得底层组件能访问到分隔符数据。组件包括核心代码示例,如`Bread`和`BreadItem`,并展示了如何将它们注册为全局组件以便在应用中使用。最后给出了使用范例。
摘要由CSDN通过智能技术生成

面包屑组件封装

目标:掌握面包屑组件如何使用

核心代码

src/components/bread/index.vue
<script lang="ts" setup name="Bread">
// 分隔符数据是位于Bread组件中 而对于分隔符数据的使用是在底层的组件中使用
// provide/inject
import { provide } from 'vue'

const props = defineProps({
  separator: {
    type: String,
    default: '',
  },
})

// 为底层组件提供数据
provide('separator', props.separator)
</script>
<template>
  <div class="bread">
    <slot />
  </div>
</template>
<style scoped lang="less">
.bread {
  display: flex;
  padding: 25px 10px;
  &-item {
    a {
      color: #666;
      transition: all 0.4s;
      &:hover {
        color: @xtxColor;
      }
    }
  }
  i {
    font-size: 12px;
    margin-left: 5px;
    margin-right: 5px;
    line-height: 22px;
  }
}
</style>
src/components/bread/item.vue
<script lang="ts" setup name="BreadItem">
import { inject } from 'vue'

defineProps({
  to: {
    type: String,
  },
})

const separator = inject('separator')
</script>
<template>
  <div class="bread-item">
    <!--
      如果to存在 有值 我们就渲染一个router-link标签
      如果to不存在  那就渲染一个span标签
    -->
    <router-link v-if="to" :to="to"><slot /></router-link>
    <span v-else><slot /></span>
    <!-- 分隔符 -->
    <i v-if="separator">{{ separator }}</i>
    <i v-else class="iconfont icon-angle-right"></i>
  </div>
</template>

<style lang="less" scoped>
.bread-item {
  i {
    margin: 0 6px;
    font-size: 10px;
  }
  // 最后一个i隐藏
  &:nth-last-of-type(1) {
    i {
      display: none;
    }
  }
}
</style>

(2)注册成全局组件应用

import Bread from './Bread/index.vue'
import BreadItem from './Bread/Item.vue'

export default {
  install (app) {
    app.component('Bread', Bread)
    app.component('BreadItem', BreadItem)
  }
}

(3)提供类型声明

declare module 'vue' {
  export interface GlobalComponents {
    Skeleton: typeof Skeleton
    Carousel: typeof Carousel
    More: typeof More
    Bread: typeof Bread
    BreadItem: typeof BreadItem
  }
}

(4)使用范例:

<Bread>
  <BreadItem to="/">首页</BreadItem>
  <BreadItem>美食</BreadItem>
</Bread>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itpeilibo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值