【问题标题】:如何根据当前路由/URL 构建动态面包屑组件?
【发布时间】:2022-01-22 09:50:00
【问题描述】:

我正在尝试构建一个基于当前 URL 动态生成链接的面包屑组件


例如

http://localhost:8080/car/create

我的面包屑应该是这样的

首页 > 汽车 > 创建


例如

http://localhost:8080/car/ford

我的面包屑应该是这样的

首页 > 汽车 > 福特


例如

http://localhost:8080/car/ford/raptor   

我的面包屑应该是这样的

首页 > 汽车 > 福特 > 猛禽

如何动态构建这样的东西?


我有

<template lang="">
    <v-row>
            <v-breadcrumbs :items="links" class="black--text">
                <template v-slot:divider>
                    <v-icon>mdi-chevron-right</v-icon>
                </template>
            </v-breadcrumbs>
        </v-row>
</template>
<script>
export default {
    name: 'Breadcrumbs',
    props: {
        title: String
    },
    data() {
        return {
            links: [
                {
                    text: 'Home',
                    disabled: false,
                    href: '/'
                },
                {
                    text: this.title,
                    disabled: true,
                    href: 'breadcrumbs_link_2'
                }
            ]
        }
    }
}
</script>

【问题讨论】:

  • 请不要标记您的帖子标题。

标签: javascript vue.js vuejs2 vue-component vuetify.js


【解决方案1】:

您需要实现一个computed 属性,如下所示:

const breadcrumb = Vue.component('breadcrumb', {
  template: '#breadcrumb',
  props: { title: String },
  computed: {
    links: function() {
      return [ 
        { text: 'Home', disabled: false, href: '/' }, 
        { text: this.title, disabled: true, href: 'breadcrumbs_link_2' },
        ...(
          (new URL(window.location.href))
            .pathname
            .split('/')
            .slice(1)
            .map(seg => ({ text: seg, disabled: false, href: seg }))
        )
      ]; 
    }
  }
});

new Vue({ el:"#app", vuetify: new Vuetify(), components: { breadcrumb } });
<script src="https://cdn.jsdelivr.net/npm/vue@2.x/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.js"></script><link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@4.x/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.x/dist/vuetify.min.css" rel="stylesheet">

<template id="breadcrumb">
  <v-row>
    <v-breadcrumbs :items="links" class="black--text">
      <template v-slot:divider><v-icon>mdi-chevron-right</v-icon></template>
    </v-breadcrumbs>
  </v-row>
</template>

<v-app id="app">
  <breadcrumb title="title_1" />
</v-app>

【讨论】:

  • 老兄……你就像我的 Vuejs 英雄
  • 哈哈很高兴能帮上忙,我已经有一段时间没有使用 vue 了,感谢您提出有趣的问题 :)
  • 这不是标题道具吗?你有第二个元素,它是文本。如果你只想要 home,然后是动态部分,那么移除计算属性结果中的第二个对象
  • 啊,我明白了。我注释掉了第 18 行:。
猜你喜欢
  • 1970-01-01
  • 2019-05-24
  • 1970-01-01
  • 1970-01-01
  • 2015-05-29
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多