Vue路由器默认子路由最初未加载

时间:2019-04-02 21:53:49

标签: javascript vue.js vue-router

我已经建立了一个简单的Vue(带有vue-router和Vuetify)项目,并且尝试获取访问父路由时要加载的默认子路由。

我已经竭尽全力按照Vue文档进行操作,但是默认的子路径在访问父路径时不会加载。

这是router.js文件中的代码:

import Vue from 'vue'
import Router from 'vue-router'

import Home from './views/Home'
import Details from './views/Details'
import List from './views/List'
import NotFound from './views/NotFound'
import Secondary from './views/Secondary'
import Sections from './views/Sections'

Vue.use(Router)

export default new Router({
  mode: 'history',
  routes: [
    {
      path: '/',
      name: 'route.home',
      component: Home
    },
    {
      path: '/list',
      name: 'route.list',
      component: List
    },
    {
      props: true,
      path: '/sections/:id',
      name: 'route.sections',
      component: Sections,
      children: [
        {
          alias: '',
          path: 'details',
          name: 'route.details',
          component: Details
        },
        {
          path: 'secondary',
          name: 'route.secondary',
          component: Secondary
        }
      ]
    },
    {
      path: '*',
      name: 'route.notfound',
      component: NotFound
    }
  ]
})

这是CodeSandbox.io项目的链接: https://codesandbox.io/s/l41zk6olqz

如果您在沙盒中按照以下步骤操作,您将看到正在发生的事情:

  1. 首页页面上,单击转到列表链接
  2. 列表页面上,单击转到部分链接
  3. 加载 Sections 页面时,我希望使用默认的子路由(名为route.details的子路由),但是,它不会

如果单击选项卡列表中的详细信息链接,则会加载详细信息页面。 我确定这是一个简单的错误,但是我看不到树木的木头。

谢谢。

更新(2019-04-03 @ 07:00): 一些进一步的挖掘,以下似乎起作用: router.js

...
  {
      props: true,
      path: '/sections/:id',
      // name: 'route.sections',
      component: Sections,
      children: [
        {
          alias: '',
          path: 'details',
          name: 'route.details',
          component: Details
        },
        {
          path: 'secondary',
          name: 'route.secondary',
          component: Secondary
        }
      ]
    }
...

然后将router-link:to="{ name: 'route.sections', params: { id: 1 } }"更改为:to="{ name: 'route.details', params: { id: 1 } }" 现在解析默认的子路由。 这是预期的吗? 我从这个答案中得到了信息:https://stackoverflow.com/a/50065601/9127864

更新(2019-04-03 @ 07:28): 进一步的挖掘表明这也是可行的: router.js

...
  {
      props: true,
      path: '/sections/:id',
      name: 'route.sections',
      component: Sections,
      redirect: {
        name: 'route.details'
      },
      children: [
        {
          alias: '',
          path: 'details',
          name: 'route.details',
          component: Details
        },
        {
          path: 'secondary',
          name: 'route.secondary',
          component: Secondary
        }
      ]
    }
...

然后我可以将router-link改回:to="{ name: 'route.sections', params: { id: 1 } }",并且当用户访问父路由器时,默认的子路由现在会加载。

希望这会在将来对其他人有所帮助。

3 个答案:

答案 0 :(得分:1)

我认为这是您从列表路线中选择路段的方式。我已经解决了您的问题,这就是我的解决方案。

用于List.vue重定向到各节。

<router-link :to="`/sections/${1}/`">Go to Sections</router-link>

答案 1 :(得分:1)

这是我发现可以工作的地方:

...
  {
      props: true,
      path: '/sections/:id',
      name: 'route.sections',
      component: Sections,
      redirect: {
        name: 'route.details'
      },
      children: [
        {
          alias: '',
          path: 'details',
          name: 'route.details',
          component: Details
        },
        {
          path: 'secondary',
          name: 'route.secondary',
          component: Secondary
        }
      ]
    }
...

现在添加 redirect: { name: 'route.details' } 可使父路由重定向到所选的子路由。

答案 2 :(得分:0)

您可以从父路由重定向到子路由:

redirect: {
   name: 'route.details'
}

还可以简单地从父级删除name属性并将其移到第一个孩子。这可能会引起一些混乱,所以我会选择选项1。

{
  alias: '',
  path: 'details',
  name: 'route.sections',
  component: Details
}