【问题标题】:How do I implement breadcrumbs with complete liks in vue.js如何在 vue.js 中实现带有完整链接的面包屑
【发布时间】:2019-06-25 09:45:10
【问题描述】:

我已经设法使用 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 breadcrumbs


【解决方案1】:

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

所以我添加了一个额外的&lt;li&gt; 来保存“主页”,第二个&lt;li&gt; 用于循环当前页面...我还将所有内容都包装在一个根中-因此不会出现关于双根元素的错误.

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>'
})

感谢大家的帮助!

【讨论】:

    【解决方案2】:

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

    <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>
      ```
    })
    

    【讨论】:

    • 好的,我试过了。我得到错误:“错误编译模板:文本“=”/“>”根元素外将被忽略。”
    • 在三个反引号内指定您的模板。像这样:Vue.use(VueBreadcrumbs, { template:``` Home ``` })
    • 我做了,但是因为我不能有多个根元素,所以会发生冲突
    • 在外面添加一个div有一个根(把两个元素都放在一个div里面),如编辑后的答案所示
    • 把html元素放在一个div里面能行吗?
    【解决方案3】:

    您可以创建自己的面包屑

    在来自路由器的文件“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'}
            },
    }
    

    创建一个面包屑组件

        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 面包屑组件中

        <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>
    

    在面包屑组件的scss中

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

    现在只在希望的地方使用你的组件

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

    【讨论】:

      猜你喜欢
      • 2016-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-25
      • 2010-10-24
      • 1970-01-01
      相关资源
      最近更新 更多