面包屑组件封装
目标:掌握面包屑组件如何使用
核心代码
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>