【问题标题】:Vue.js – New routes are always placed on top of current routeVue.js – 新路由总是放在当前路由之上
【发布时间】:2020-11-05 22:29:02
【问题描述】:

在我的Vue.js 应用程序中,我使用屏幕左侧的导航抽屉进行导航。我正在使用VuetifyVue Router

问题 在更改了我的routes 之后,我以前的许多路由功能都搞砸了。每当用户单击一个元素以导航到一个新站点时,路由就会像这样附加在前一个站点之上。

在用户点击链接之前进行路由:

http://localhost:8080/organization/:organization_id/planner/events

用户点击链接后的新路由:

http://localhost:8080/organization/:organization_id/planner/management/contracts

路由器

routes: [
    // Login
    {
        path: '/login',
        component: Login,
    },
    // Organization
    {
        path: '/organization',
        component: Organization,
    },
    // Organization Detail Page
    {
        path: '/organization/:organization_id',
        component: OrganizationDetail,
        children: [    
            // Module: Planner
            {
                path: 'planner',
                component: Planner
            },
            // Planner > Events
            {
                path: 'planner/events',
                component: Events
            },
            {
                path: 'planner/events/new',
                component: NewEvent
            },
            {
                path: 'planner/events/details/:event_id',
                component: EventDetails
            },
            // Planner > Calendar
            {
                path: 'planner/calendar',
                component: Calendar
            },
            // Module: Management
            {
                path: 'management',
                component: Management
            },
            // Management > Users
            {
                path: 'management/users',
                component: Events
            },
            {
                path: 'management/users/new',
                component: NewUser
            },
            {
                path: 'management/users/details/:user_id',
                component: UserDetails
            },
            // Planner > Contracts
            {
                path: 'management/contracts',
                component: Contracts
            }
        ]
    }
]

NavigationDrawer.vue(更新):

    <template>
  <div id="navigation">
    <nav>
        <v-navigation-drawer
          v-model="drawer"
          :clipped="$vuetify.breakpoint.lgAndUp"
          width="400"
          fixed
          app
        >
          <v-list>
            <template v-for="item in items">
              <v-row
                v-if="item.heading"
                :key="item.heading"
                align="center"
              >
              </v-row>
              <v-list-group
                v-else-if="item.children"
                :key="item.text"
                v-model="item.model"
                append-icon="mdi-chevron-down"
                class="nav"
                link
                router :to="item.route"
              >
                <v-list-item
                  v-for="(child, i) in item.children"
                  :key="i"
                  link
                  router :to="child.route"
                >
                  <v-list-item-action v-if="child.icon">
                    <v-icon>{{ child.icon }}</v-icon>
                  </v-list-item-action>
                  <v-list-item-content>
                    <v-list-item-title>
                      {{ child.text }}
                    </v-list-item-title>
                  </v-list-item-content>
                </v-list-item>
              </v-list-group>
            </template>
          </v-list>
        </v-navigation-drawer>
    
        <v-app-bar
          :clipped-left="$vuetify.breakpoint.lgAndUp"
          app
          dark
        >
          <v-app-bar-nav-icon @click.stop="drawer = !drawer"></v-app-bar-nav-icon>
          
        </v-app-bar>
    </nav>
  </div>
</template>

<script>

  export default {
    name: 'NavigationDrawer',
    el: '#app',

    data: () => ({
      drawer: true,
      menu: false,
      items: [
    {
        text: 'Planner',
        children: [
            { text: 'Events', route:'/organization/' + this.$route.params.organization_id + '/planner/events'},
            { text: 'Calendar', route:'/organization/' + this.$route.params.organization_id + '/planner/calendar'}
        ],
    },
    {
        text: 'Management',
        children: [
            { text: 'Users', route:'/organization/' + this.$route.params.organization_id + '/management/users'},
            { text: 'Contracts', route:'/organization/' + this.$route.params.organization_id + '/management/contracts'}
        ],
    },
]
    }),
    methods: {
      logout() {
        // some awesome stuff
      }
    }
  }
</script>

(NewUser, NewEvent) 等其他路由不存储在导航抽屉中,而是通过按钮手动调用。

我知道这与我的路线有关。然而,这些并没有错误配置,因为父子关系对于显示正确的内容和实现一些标题信息很重要。导航抽屉也以正确的方式工作。我没有改变任何东西。

另外,如果我在NewEventNewUser 上使用router.back(),则不会发生任何事情。 :(

非常感谢您的帮助,谢谢!

【问题讨论】:

  • contracts路由是组织明细路由的子路由,所以会继承组织明细的路径。它似乎可以正常工作。
  • @DecadeMoon 没错。 “organization/:organization_id”应该总是被继承。但应用也继承了模块页面(例如“planner”或“management”)。
  • 请出示您的链接代码?
  • @mcd 你能不能把 route:'/management/users' 改成 route:'/organization/1/management/users' 或者你正在使用的任何组织 ID,并检查它是否工作......
  • @mcd 已回答 ^^ 如果您需要更多解释,请告诉我。

标签: vue.js vue-router


【解决方案1】:

问题是因为

{ text: 'Events', route:'/planner/events'},

由于初始正斜杠,上述路由将网站重定向到 http://localhost:8080/planner/events。

使用$route.params 从 URL 获取参数,如下所示。

<div>User {{ $route.params.organization_id }}</div>

this.$route.params.organization_id

【讨论】:

  • 如何将 'this.$route.params.organization_id' 嵌入到我的阵列中?输出应该是带有参数 id 的路由。但我不能把它写在字符串中以获得最终输出。
  • @mcd route:'/organization/' + this.$route.params.organization_id + '/management/users' 或者你可以var organization_ID_from_vux = this.$route.params.organization_id; route:'/organization/' + organization_ID_from_vux + '/management/users'
  • 我之前已经尝试过,但它让我的导航抽屉只是空白:(
  • @mcd 你可以添加文件的导入,你的问题中有列表项吗?
  • 我用 NavigationDrawer.vue 的所有代码更新了问题
猜你喜欢
  • 2019-10-18
  • 2015-01-19
  • 2019-08-26
  • 2020-10-17
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2021-05-05
  • 2017-06-06
相关资源
最近更新 更多