注册一个全局的面包屑(自动注册全局组件)

130 阅读1分钟

简单注册一个全局的面包屑/

我们先搞一个全局的自动注册组件的一个插件;我们开始
src/components/index.js

// 这里我们先匹配 (libary 文件夹下的; 是否深度检索; 正则: 匹配 .vue 文件)
const requireComponent = require.context('./libary', true, /\.vue$/)
export default {
  install (Vue) {
    // 在循环遍历
    requireComponent.keys().forEach((item) => {
      // console.log(requireComponent[item], 77)  //  ['./bread.vue', './pubArt.vue', './qq/q.vue']
      /* 获取的是 每一个组件暴露出来的对象 */
      const defaultObj = requireComponent(item).default
      // 直接注册
      Vue.component(defaultObj.name, defaultObj)
    })
  }
}

// 使用的话就是直接全局组件的名字
/////
<script>
export default {
  name: 'Goods',
  props: {
    to: {
      type: String
    }
  },
  setup () {
  }
}
</script>
/////
示例: <Goods></Goods>
main.js

引入刚刚的插件
import componentPlugin from '@/components/index.js'
// 全局注册组件
createApp(App).use(componentPlugin)
现在来搞面包屑.
index.vue
// 使用两个免费的组件(在上面的 libary 文件夹下新建的两个 .vue 文件)

<template>
  <XtxBread>
    <XtxBreadItem to="nima">主页</XtxBreadItem>
    <XtxBreadItem to="">分页</XtxBreadItem>
  </XtxBread>
</template>

<script>
// 直系亲属传值(只限单方面父传后代)
import { provide } from 'vue'

export default {
  name: 'home',
  setup () {
    provide('separator', '>')
  }

}
</script>

第一层

src/components/libary/xtx-bread.vue

<template>
  <div class="xtx-bread">
    <slot></slot>
  </div>
</template>

<script>
export default {
  name: 'XtxBread',
}
</script>

<style lang='less'  scoped>
.xtx-bread {
  display: flex;

  /deep/.xtx-bread-item:last-child {
    span {
      display: none;
    }
  }
}
</style>

第二层

src/components/libary/Slider/xtx-bread-item.vue

<template>
  <div class="xtx-bread-item">
    <router-link v-if="to" :to="to">
      <slot></slot>
    </router-link>
    <template v-else>
      <slot></slot>
    </template>
    <span>{{ separator }}</span>
  </div>
</template>

<script>
import { inject } from 'vue'
export default {
  name: 'XtxBreadItem',
  props: {
    to: {
      type: String
    }
  },
  setup () {
    const separator = inject('separator')
    return { separator }
  }
}
</script>
<style lang='less'  scoped>
</style>

效果图: 额!虽然不好看但是, 没有但是,确实不好看!

Snipaste_2022-07-03_21-40-04.png