Vue-4 路由的配置和调用,命名路由和命名视图,嵌套路由,重定向和别名

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/FlowGuanEr/article/details/98185467

Vue-4 路由的配置和调用,命名路由和命名视图,嵌套路由,重定向和别名

Vue-router的安装和基本配置

路由是 Vue 通过操作切换或调用组件的另一种方式。

常见应用场景就是后台管理系统中的选项卡操作。

比如某个后台管理系统的侧边栏有商品管理、用户管理、订单管理选项,在点击左侧的菜单时,右侧内容部分展示对应的管理模块。

要在 vue-cli 中使用 vue 的路由,要先在当前项目中安装 vue-router 依赖包,加以配置之后才能使用。

路由是 vue-cli 项目必备的功能,所以一般情况下,在安装项目时,会在是否安装路由这里选择 yes。

如果在安装项目的同时就安装了路由,那么项目的 src 文件夹中会自动有一个 router 的文件夹,路由已经被配置好了。只需要向里面添加内容就好了。

但是我们还是要了解路由配置的整个过程。

如果没有在初始化项目模板时安装路由,那么路由的配置总共需要以下几个步骤。

1. 安装vue-router依赖包

npm i vue-router --save

2. 配置路由

路由一般都配置在 src 文件夹中:

// 项目的src目录
src
    └── App.vue
    └── main.js
    └── assets
    └── components
            └── good-list.vue
            └── user-list.vue
            └── order-list.vue
    └── router // 路由配置文件夹
            └── index.js // 路由配置文件

路由配置文件 index.js:

// router>index.js

import Vue from 'vue' 
// 导入路由依赖包
import Router from 'vue-router'

// 导入被路由的组件,每个路由应该映射一个组件,要配置三个菜单路由,就应该映射到三个组件
import GoodList from './components/good-list'
import UserList from './components/user-list'
import OrderList from './components/order-list'

Vue.use(Router)

// 创建 vueRouter 实例,并导出
export default new Router({
  routes: [
    // 一个路由用一个对象包裹,对象中的每个键值对代表不同的意义
    // 我们先介绍 path 和 component  
    { path: '/good-list', component: GoodList },
    { path: '/user-list', component: UserList },
    { path: '/order-list', component: OrderList }
  ]
});

此时路由还不能使用,因为当前的 index.js 只是一个单独的 js 文件,想要使用,还需要将 router 实例导入到根组件的实例化中。

// main.js
import Vue from 'vue'
import App from './App'

// 从 router>index.js 文件中导入 router 实例
import router from './router'

Vue.config.productionTip = false;

new Vue({
  el: '#app',
  // 将 router 作为参数传到这里,整个项目就能使用路由了
  router, 
  components: { App },
  template: '<App/>'
})

3. 调用路由

<!-- home.vue -->
<template>
    <div class="home">
        <!-- 
            锚点:
            用router-link标签,提供切换视图的动作。
            to属性的值是路由配置中的path
        -->
        <router-link to="/good-list">商品列表</router-link>
        <router-link to="/user-list">用户列表</router-link>
        <router-link to="/order-list">订单列表</router-link>

        <!-- 
            显示路由视图
            点击 router-link 菜单,在 router-view 所在的位置渲染该 path 对应的 component
         -->
        <router-view />
    </div>
</template>

有时候切换组件不会通过锚点,而是在代码执行并完成了某些操作之后。比如点击登录按钮,只有在登录成功之后才显示首页。那么路由组件的切换就是在登录成功的回调函数中执行,这个时候就不能用锚点,而是 JS 跳转。

// ...
login() {
    setTimeout(() => {
        // 3s 之后切换路由
        this.$router.push('/user-list');
        /* 
        也可以这样写:
        this.$router.push({
            path: '/user-list'
        });
        */
    }, 3000);
}
// ...

命名路由和命名视图

1. 命名路由

除了利用 path 属性调用路由之外,我们还可以在配置路由时,为每个路由设置一个 name 值,然后通过 name 值调用路由,两种方式有各自的应用场景。我们先说命名路由的使用。

// router>index.js 中的 routes
routes: [ 
    { 
      path: '/good-list', 
      component: GoodList,
      // 为路由命名,这个名称不一定和 path 保持一致
      // 但是一般情况下,我们遵从见名知意的规则
      name: 'good-list' 
    },
    { 
      path: '/user-list',
      component: UserList,
      name: 'user-list'
    },
    { 
      path: '/order-list',
      component: OrderList,
      name: 'order-list'
    }
]

调用命名路由:

<!-- to属性中是一个对象,所以要对 to 属性使用 v-bind 指令 -->
<router-link :to="{name: 'good-list'}">商品列表</router-link>
<router-link :to="{name: 'user-list'}">用户列表</router-link>
<router-link :to="{name: 'order-list'}">订单列表</router-link>
// js 调用
this.$router.push({
    name: 'user-list'
});

2. 命名视图

同时 (同级) 展示多个组件,可以让所有组件通过作为子组件被同一个父组件调用,也可通过 <router-view> 标签的 name 属性同级展示多个视图。在配置时需要使用 components 而不是 component

// router>index.js 中的 routes 
routes: [
    {
      path: '/',
      components: {
        /* 
            当路由路径为 '/' 时
            router-view 标签如果不设置 name 属性,就渲染 GoodList 组件
            router-view name 值为 user-list 时,渲染 UseList 组件
            router-view name 值为 order-list 时,渲染 OrderList 组件

            它们可以渲染一个,也可以被同时渲染,不互斥
        */
        default: GoodList, // 可选
        'user-list': UserList,
        'order-list': OrderList
      }
    }
]

调用命名视图:

...
<router-view />
<router-view name="user-list"/>
<router-view name="order-list"/>
...

注:
如果一个组件的父组件是固定的,比如导航,侧边栏,页面内容,那就使用子组件导入父组件的方式调用它们。
如果一个组件,可能会被很多不同的组件调用,那么每个调用它的父组件都要先导入该组件,传入实例的 components 才能使用,那样太麻烦了,又造成了无法解决的莫名其妙的代码冗余。这种场景就使用命名视图,代码会更简洁。

嵌套路由和路由的封装

有时候某个路由组件中会包含属于这个组件本身的路由操作。如 Angular 的官网。

现在给一个示例,比如一级菜单有商品列表,用户列表,订单列表。订单列表中还可以有全部,已付款,已发货等操作。切换子菜单也可以切换内容。

这种情况我们就要使用到子路由的配置。

// router>index.js 中的routes
routes: routes: [
    { 
      path: '/good-list', 
      component: GoodList
    },
    { 
      path: '/user-list',
      component: UserList
    },
    { 
      path: '/order-list',
      component: OrderList,
      // order-list 的子路由配置在 children 中
      children: [
        {
          // 子路由配置时不加 '/'
          // 加 '/' 代表一级路由,就和 order-list 同级了
          path: 'order-list-1',component: OrderList1
        },
        {
          path: 'order-list-2', component: OrderList2
        },
        {
          path: 'order-list-3', component: OrderList3
        }
      ]
    }
]

<OrderList> 组件中调用其子路由:

<div class="order-list">
    <!-- 调用子路由,要加父级路径 -->
    <router-link to="/order-list/order-list-1">全部</router-link>
    <router-link to="/order-list/order-list-2">待付款</router-link>
    <router-link to="/order-list/order-list-3">待收货</router-link>

    <!-- 渲染子路由视图 -->
    <router-view />
</div>

如果子路由中还需要子路由,那就在子路由中继续写。 children

如果路由的配置结构特别复杂,可能要嵌套多级路由,我们可以按模块将路由单独封装,最终引入到 router 中的 index.js 里。

// router>order-list.js

import OrderList from '@/components/OrderList'
import OrderList1 from '@/components/OrderList1'
import OrderList2 from '@/components/OrderList2'
import OrderList3 from '@/components/OrderList3'

// 将 order-list 的配置导出
export default {
  path: '/order-list',
  component: OrderList,
  children: [{
      path: 'order-list-1',
      component: OrderList1
    },
    {
      path: 'order-list-2',
      component: OrderList2
    },
    {
      path: 'order-list-3',
      component: OrderList3
    }
  ]
};
// router>index.js
import Vue from 'vue'
import Router from 'vue-router'

import GoodList from '@/components/GoodList'
import UserList from '@/components/UserList'

// 导入 order-list 配置
import OrderList from './order-list'

Vue.use(Router)

export default new Router({
  routes: [
    { 
      path: '/good-list', 
      component: GoodList
    },
    { 
      path: '/user-list',
      component: UserList
    },
    OrderList
  ]
});

注:
这样的封装不会对 main.js 中的配置有任何影响,main.js 中依旧只引入 router.js,在实例化时传入 router

重定向和别名

1. 重定向
有时候一个组件中的子路由有很多,但是我们在切换到这个组建时,希望能展示其中的某个子路由内容,不然页面会出现留白,用户体验很差。

// router>order-list.js 
export default {
  path: '/order-list',
  component: OrderList,
  // 重定向,当菜单切换到order-list时,order-list-1的内容会默认显示
  // 页面中不会出现留白
  redirect: '/order-list/order-list-1'
  children: [{
      path: 'order-list-1',
      component: OrderList1
    },
    {
      path: 'order-list-2',
      component: OrderList2
    },
    {
      path: 'order-list-3',
      component: OrderList3
    }
  ]
};

这样能实现效果,但是如果子路由嵌套太多,redirect 要拼接的父级路由就特别长,这种情况可以用命名路由:

// router>order-list.js 
export default {
  path: '/order-list',
  component: OrderList,
  redirect: {
      // 不用拼接冗长的路径
      name: 'order-list-1'
  }
  children: [{
      path: 'order-list-1',
      component: OrderList1,
      name: 'order-list-1'
    },
    {
      path: 'order-list-2',
      component: OrderList2
    },
    {
      path: 'order-list-3',
      component: OrderList3
    }
  ]
};

2. 别名

Vue 也允许我们为某个路由起一个别名,访问这个别名也是在访问这个路由。

// router>index.js 
export default new Router({
  routes: [
    { 
      path: '/good-list', 
      component: GoodList,
      // 路由的路径为 '/another-name' 时就代表 '/good-list'
      alias: '/another-name'
    },
    { 
      path: '/user-list',
      component: UserList
    },
    OrderList
  ]
});

猜你喜欢

转载自blog.csdn.net/FlowGuanEr/article/details/98185467