如何在 vue.js 中实现带有完整链接的面包屑导航

问题描述 投票:0回答:3

我已经成功地使用 npm 在我的 vue.js 应用程序中实现了面包屑。 但我希望我的面包屑显示指向上一页的链接,旁边是指向当前页面(包括 id)的链接。像这样:

主页 > 详细信息页面(作为可点击的链接)

我已经尝试按照此链接中的示例https://www.npmjs.com/package/vue-2-breadcrumbs]

这是我的 index.js 文件

import Vue from 'vue'
import Details from '@/components/Details'
import Router from 'vue-router'
import HomePage from '@/components/HomePage'
import VueBreadcrumbs from 'vue-2-breadcrumbs'

Vue.use(Router)
Vue.use(VueBreadcrumbs,{
template:
    '            <ul class="breadcrumb">\n' +
    '                <li v-for="(crumb, key) in $breadcrumbs" v-if="crumb.meta.breadcrumb" :key="key" class="breadcrumb-item active" aria-current="page">\n' +
    '                    <router-link :to="{ path: getPath(crumb) }">{{ getBreadcrumb(crumb.meta.breadcrumb) }}</router-link>' +
    '                </li>\n' +
    '            </ul>\n' 
})

export default new Router({
    routes: [
        {
            path: '/',
            component: HomePage,
            name: 'HomePage',
            meta: {
                breadcrumb: 'Home Page',
            },

        },
        {
            path: '/Details/:id',
            component: Details,
            meta:{
                breadcrumb: function () {
                    const {name} = this.$route;
                    return `${name}`;
                  }
            },
            name: 'Details',
            props: true
        }


    ]
})

全部编译,并且渲染(但只有一个链接,指向当前页面)。现在我想将历史链接添加到我的面包屑(主页链接)。我该怎么做?

vue.js vue-router breadcrumbs
3个回答
1
投票

好的,所以我从你们的所有评论中得到了一些灵感,这就是我修复它的方法:

所以我添加了一个额外的

<li>
来保存“主页”,第二个
<li>
用于在当前页面上循环......我还将所有内容都包装在一个根中 - 所以不会发生关于双根元素的错误。

Vue.use(VueBreadcrumbs,{
template:

'        <div v-if="$breadcrumbs.length" aria-label="breadcrumb">\n' +
'            <ol class="breadcrumb">\n' +
' <li class="breadcrumb-item"><a href="/">Home</a></li>' +
'                <li v-for="(crumb, key) in $breadcrumbs" v-if="crumb.meta.breadcrumb" :key="key" class="breadcrumb-item active" aria-current="page">\n' +
'                    <router-link :to="{ path: getPath(crumb) }">{{ getBreadcrumb(crumb.meta.breadcrumb) }}</router-link>' +
'                </li>\n' +
'            </ol>\n' +
'        </div>'
})

谢谢大家的帮助!


0
投票

在您的模板中添加另一个路由器链接:

<div id="root">
<router-link :to="/">Home</router-link>
<ul class="breadcrumb">
  <li v-for="(crumb, key) in $breadcrumbs" v-if="crumb.meta.breadcrumb" :key="key" class="breadcrumb-item active" aria-current="page">
    <router-link :to="{ path: getPath(crumb) }">{{ getBreadcrumb(crumb.meta.breadcrumb) }}</router-link>
  </li>
</ul>
</div>

编辑: 以这种方式声明您的模板:

Vue.use(VueBreadcrumbs, {
  template: ```
    <div id="root">
    <router-link :to="/">Home</router-link>
    <ul class="breadcrumb">
      <li v-for="(crumb, key) in $breadcrumbs" v-if="crumb.meta.breadcrumb" :key="key" class="breadcrumb-item active" aria-current="page">
        <router-link :to="{ path: getPath(crumb) }">{{ getBreadcrumb(crumb.meta.breadcrumb) }}</router-link>
      </li>
    </ul>
    </div>
  ```
})

0
投票

您可以创建自己的面包屑导航

在路由器的“index.ts”文件中

export let activedRoutes: RouteRecord[] = []

router.beforeEach((to, from, next) => {
    activedRoutes = [];
    to.matched.forEach((record) => { activedRoutes.push(record) })
    next();
});

在路线定义中

{
        path: 'my-path-route',
        name: 'MyNameRoute',
        component: () => import('./MyComponent/MyComponent.component.vue'),
        meta: {
            title: 'Title',
            icon: 'my-icon',
            breadcrumb: { label: 'Label of bradcrumb', routeName: 'MyNameRoute'}
        },
}

创建一个 BreadbrumbComponent

    import Vue from 'vue';
import Component from 'vue-class-component';
import { Watch } from 'vue-property-decorator';
import { activedRoutes } from '@/router';

@Component({})
export default class BreadcrumbsComponent extends Vue {

    breadcrumbs = []

    @Watch('$route')
    changeRoute() {
        this.breadcrumbs = activedRoutes.map(e => e.meta?.breadcrumb).filter(e => e);
    }

    created() {
        this.changeRoute()
    }

}

在 html 中的 BreadcrumbComponent

    <template>
  <div class="breadcrumbs" v-if="breadcrumbs.length > 1">
    <ul class="v-breadcrumbs">
      <template v-for="(item, i) in breadcrumbs">
        <li :key="item.label">
          <router-link
            class="v-breadcrumbs__item"
            :to="{ name: item.routeName }"
            v-html="item.label"
            :class="{ disabled: breadcrumbs.length - 1 == i }"
          />
        </li>
        <li
          v-if="breadcrumbs.length - 1 > i"
          class="v-breadcrumbs__divider"
          :key="item.label"
        >
          <v-icon>mdi-chevron-right</v-icon>
        </li>
      </template>
    </ul>
  </div>
</template>

在 BreadcrumbComponent 的 scss 中

    .breadcrumbs {
    .disabled {
        text-decoration: none;
        color: rgba(0, 0, 0, 0.38);
        cursor: default;
    }
}

现在只在需要的地方使用你的组件

可以使用vuetify的面包屑进行补充 https://vuetifyjs.com/en/components/breadcrumbs/#large

© www.soinside.com 2019 - 2024. All rights reserved.