| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- <template>
- <el-breadcrumb
- class="c-breadcrumb"
- separator="/"
- >
- <transition-group name="breadcrumb">
- <el-breadcrumb-item
- v-for="(item, index) in levelList"
- :key="item.path"
- >
- <span
- v-if="index === levelList.length - 1"
- class="last"
- >
- {{ item.meta.title }}
- </span>
- <span
- v-else-if="index === 0"
- class="placeholder"
- >
- {{ item.meta.title }}
- </span>
- <a
- v-else
- @click.prevent="handleLink(item)"
- >
- {{ item.meta.title }}
- </a>
- </el-breadcrumb-item>
- </transition-group>
- </el-breadcrumb>
- </template>
- <script>
- import { compile } from 'path-to-regexp'
- export default {
- name: 'Breadcrumb',
- computed: {
- levelList () {
- return this.$route.matched.filter(item => item.meta?.title)
- }
- },
- methods: {
- handleLink (item) {
- const { redirect, name, path } = item
- if (redirect) {
- this.$router.push(redirect)
- return
- }
- if (name) {
- this.$router.push({
- name,
- params: { ...this.$route.params }
- })
- return
- }
- this.$router.push(compile(path)(this.$route.params))
- }
- }
- }
- </script>
- <style lang="scss" scoped>
- .breadcrumb-enter-active,
- .breadcrumb-leave-active {
- transition: all 0.5s;
- }
- .breadcrumb-enter,
- .breadcrumb-leave-active {
- opacity: 0;
- transform: translateX(20px);
- }
- .breadcrumb-move {
- transition: all 0.5s;
- }
- .breadcrumb-leave-active {
- position: absolute;
- }
- .c-breadcrumb {
- display: inline-block;
- font-size: 14px;
- line-height: 50px;
- user-select: none;
- .last {
- color: #97a8be;
- cursor: auto;
- }
- .placeholder {
- font-weight: 700;
- }
- }
- </style>
|