vue-router 路由嵌套显示不出来_Vue Router (一)

Vue Router(一)

1. 安装

1.1 NPM 安装

npm i vue-router -S

1.2 引入Router

使用的项目是通过单文件组件文章中构建的。

单文件组件

在man.js中引入router

import VueRouter from 'vue-router'
Vue.use(VueRouter)

1.3 使用router

  • 在src文件夹下新增
    • router/index.js
    • pages/a.vue
    • pages/b.vue
ab0f794e4f7dddcf16afb8801b927881.png
image-20200730150514499
  • a.vue与b.vue增加以下内容
pageA



  • router/index.js增加以下内容
import VueRouter from 'vue-router';
import VueA from '../pages/a.vue';
import VueB from '../pages/b.vue';

//  route 配置
const routes = [
  {
    path: '/a',  // url 匹配地址
    name: 'pageA', // route name
    component: VueA // 渲染的组价
  },
  {
    path: '/b',
    name: 'pageB',
    component: VueB
  }
];

// 创建router实例
const router = new VueRouter({
  mode: 'hash', // hash路由
  base: process.env.BASE_URL,
  routes
});

// 导出router
export default router;

  • App.vue 文件
首页




  • main.js 文件
import Vue from 'vue';
import VueRouter from 'vue-router';
import router from './router';

Vue.use(VueRouter);

new Vue({
  router, //注入router,在根组件注入,使所有子组件都可以通过vm.$router获取路由信息
  render: (h) => h(App)
}).$mount('#app');

注入router,在根组件注入,使所有子组件都可以通过vm.$router获取路由信息

  • 打开浏览器输入项目地址:http://localhost:8081/#/
6934a4b4b1046a61012c519f91639b5f.png
image-20200730161756598
  • url输入a.vue页面地址:http://localhost:8081/#/a
d9c5c0b3a2bf837831e8618276663ebf.png
image-20200730161951042
  • url输入b.vue页面地址:http://localhost:8081/#/b
4691019b605c59a6a80229e7a192ce3c.png
image-20200730162014736
  • 修改app.vue代码
首页
ab



  • 修改router.js
//  route 配置
const routes = [
  {
    path: '/a/:id',  // url 匹配地址
    name: 'pageA', // route name
    component: VueA // 渲染的组价
  },
  {
    path: '/b/:id',
    name: 'pageB',
    component: VueB
  }
];
  • 修改a.vue和b.vue
pageA


  • 查看页面并点击按钮
b9bf009e02f119e281a7ce28a4999895.png
image-20200730174556888
6b420b9af31cb5f47bfd20f794c01bbb.png
image-20200730174653125
  • 匹配优先级

有时候,同一个路径可以匹配多个路由,此时,匹配的优先级就按照路由的定义顺序:谁先定义的,谁的优先级就最高

2. 路由配置

路由标签

  • router-link :跳转至route页面的标签
  • router-view :route页面渲染区域

路由routes配置

  • path: string,
  • component?: Component,
  • name?: string, // 命名路由
  • components?: { [name: string]: Component }, // 命名视图组件
  • redirect?: string | Location | Function,
  • props?: boolean | Object | Function,
  • alias?: string | Array,
  • children?: Array, // 嵌套路由
  • beforeEnter?: (to: Route, from: Route, next: Function) => void,
  • meta?: any,
  • caseSensitive?: boolean, // 匹配规则是否大小写敏感?(默认值:false)
  • pathToRegexpOptions?: Object

路由Router构建参数

  • routes :具体route页面配置
  • mode :router的模式
  • base :router的基本路径
  • linkActiveClass :router-link 激活时的class类名
  • linkExactActiveClass  :router-link exact 模式下激活时的class类名
  • scrollBehavior :进入route页面滚动行为

示例

  • 标签使用
<template>

  <router-link to="/a">a菜单router-link>
  <div>
  
    <router-view>router-view>
  div>
template> 

  • routes配置
import PageA from './pageA.vue'
import PageB from './pageB.vue'

//  route 配置
const routeA = {
  name:'a',
  path:'/a',
  components:PageA
}
const routeB = {
  name:'b',
  path:'/b',
  components:PageB
}

const routeRedirect = {
  name:'redirect',
  path:'*',
  redirect:'/a' // routeA
}

// routes配置 route的Array集合
const routes = [routeA,routeB,routeRedirect]

export default routes;
  • Router配置

import VueRouter from 'vue-router';
import routes from './routes';

const router = new VueRouter({
  routes:routes,
  mode:'hash'
  base:'/',
  linkActiveClass:'classA'
  // ...
})

export default router

2.1 router-link 跳转链接

组件支持用户在具有路由功能的应用中 (点击) 导航。通过 to 属性指定目标地址,默认渲染成带有正确链接的 标签,可以通过配置 tag 属性生成别的标签.。另外,当目标路由成功激活时,链接元素自动设置一个表示激活的 CSS 类名。

比起写死的 会好一些,理由如下:

  1. 无论是 HTML5 history 模式还是 hash 模式,它的表现行为一致,所以,当你要切换路由模式,或者在 IE9 降级使用 hash 模式,无须作任何变动。
  2. 在 HTML5 history 模式下,router-link 会守卫点击事件,让浏览器不再重新加载页面。
  3. 当你在 HTML5 history 模式下使用 base 选项之后,所有的 to 属性都不需要写 (基路径) 了。
  • 属性
  1. to

路由目标可以使path字符串,或者目标route对象

  • 类型: string | Location

  • required

表示目标路由的链接。当被点击后,内部会立刻把 to 的值传到 router.push(),所以这个值可以是一个字符串或者是描述目标位置的对象。


<router-link to="home">Homerouter-link>

<a href="home">Homea>


<router-link v-bind:to="'home'">Homerouter-link>


<router-link :to="'home'">Homerouter-link>


<router-link :to="{ path: 'home' }">Homerouter-link>


<router-link :to="{ name: 'user', params: { userId: 123 }}">Userrouter-link>


<router-link :to="{ path: 'register', query: { plan: 'private' }}"
  >Registerrouter-link
>

  1. replace

使用replace方式加载路由

  • 类型: boolean

  • 默认值: false

设置 replace 属性的话,当点击时,会调用 router.replace() 而不是 router.push(),于是导航后不会留下 history 记录。

<router-link :to="{ path: '/abc'}" replace>router-link>
  1. append

路由改变方式为当前url末尾追加path

  • 类型: boolean

  • 默认值: false

设置 append 属性后,则在当前 (相对) 路径前添加基路径。例如,我们从 /a 导航到一个相对路径 b,如果没有配置 append,则路径为 /b,如果配了,则为 /a/b

<router-link :to="{ path: 'relative/path'}" append>router-link>
  1. tag

router-link渲染的html标签,默认为a

  • 类型: string

  • 默认值: "a"

有时候想要 渲染成某种标签,例如 。于是我们使用 tag prop 类指定何种标签,同样它还是会监听点击,触发导航。

<router-link to="/foo" tag="li">foorouter-link>

<li>fooli>

  1. active-class

激活时的class类名

  • 类型: string

  • 默认值: "router-link-active"

设置链接激活时使用的 CSS 类名。默认值可以通过路由的构造选项 linkActiveClass 来全局配置。

  1. exact

路由是否为精确匹配

  • 类型: boolean

  • 默认值: false

“是否激活”默认类名的依据是包含匹配。举个例子,如果当前的路径是 /a 开头的,那么 也会被设置 CSS 类名。

按照这个规则,每个路由都会激活 !想要链接使用“精确匹配模式”,则使用 exact 属性:


<router-link to="/" exact>router-link>
  1. event

触发导航的事件,可以设置多个['click','mouseEnter'...]

  • 类型: string | Array

  • 默认值: 'click'

声明可以用来触发导航的事件。可以是一个字符串或是一个包含字符串的数组。

  1. exact-active-class

精确匹配计划的class类名

  • 类型: string

  • 默认值: "router-link-exact-active"

配置当链接被精确匹配的时候应该激活的 class。注意默认值也是可以通过路由构造函数选项 linkExactActiveClass 进行全局配置的。

  1. aria-current-value
  • 类型: 'page' | 'step' | 'location' | 'date' | 'time'

  • 默认值: "page"

当链接根据精确匹配规则激活时配置的 aria-current 的值。这个值应该是 ARIA 规范中允许的 aria-current 的值。在绝大多数场景下,默认值 page 应该是最合适的。

2.2 router-view

组件是一个 functional 组件,渲染路径匹配到的视图组件。 渲染的组件还可以内嵌自己的 ,根据嵌套路径,渲染嵌套组件。

其他属性 (非 router-view 使用的属性) 都直接传给渲染的组件, 很多时候,每个路由的数据都是包含在路由参数中。

因为它也是个组件,所以可以配合 使用。如果两个结合一起用,要确保在内层使用

<transition>
  <keep-alive>
    <router-view>router-view>
  keep-alive>
transition>

2.3 routes

  • routes

  • 类型: Array

RouteConfig 的类型定义:

interface RouteConfig = {
  path: string,
  component?: Component,
  name?: string, // 命名路由
  components?: { [name: string]: Component }, // 命名视图组件
  redirect?: string | Location | Function,
  props?: boolean | Object | Function,
  alias?: string | Array,
  children?: Array, // 嵌套路由
  beforeEnter?: (to: Route, from: Route, next: Function) => void,
  meta?: any,// 2.6.0+
  caseSensitive?: boolean, // 匹配规则是否大小写敏感?(默认值:false)
  pathToRegexpOptions?: Object // 编译正则的选项
}
  1. path

页面地址路径,可以通过动态路由获取数据

const routeA = {
  // 基本
  // path:'/a'
  // 动态路径参数 以冒号开头
  path:'/a:id'
}
模式匹配路径$route.params
/useruser
/user/:username/user/evan{ username: 'evan' }
/user/:username/post/:post_id/user/evan/post/123{ username: 'evan', post_id: '123' }
  1. component
  • 常规组件与异步组件
import VueA from '../pages/a.vue';

//  route 配置
const routes = [
  {
    path: '/a/:id',  // url 匹配地址
    name: 'pageA', // route name
    component: VueA // 组件A
  },
  {
    path: '/b/:id',
    name: 'pageB',
    // 能够被 Webpack 自动代码分割的异步组件
    component: () => import(/* webpackChunkName: "group-foo" */ '../pages/b.vue')
  }
];

路由懒加载

  1. name
  • 通过name可以使路由跳转

要链接到一个命名路由,可以给 router-link 的 to 属性传一个对象:

<router-link :to="{ name: 'user', params: { userId: 123 }}">Userrouter-link>

这跟代码调用 router.push() 是一回事:

router.push({ name: 'user', params: { userId: 123 }})

这两种方式都会把路由导航到 /user/123 路径。

路由命名

  1. components
  • 命名视图

命名视图

  1. redirect
  • 重定向

重定向

  1. props
  • 路由组件传参

路由组件传参

  1. alias
  • 别名

别名

  1. children
  • 嵌套路由

嵌套路由

  1. beforeEnter
  • 路由守卫钩子函数

导航守卫

  1. meta
  • 路由元信息

路由元信息

  1. caseSensitive
  • 匹配规则是否大小写敏感
  1. pathToRegexpOptions
  • 编译正则的选项

2.4 Router

  1. routes

route的Array

  1. mode

路由模式 hash 或 history

  • 类型: string

  • 默认值: "hash" (浏览器环境) | "abstract" (Node.js 环境)

  • 可选值: "hash" | "history" | "abstract"

  1. base

路由的基础路径

  • 类型: string

  • 默认值: "/"

应用的基路径。例如,如果整个单页应用服务在 /app/ 下,然后 base 就应该设为 "/app/"

  1. linkActiveClass
  • 类型: string

  • 默认值: "router-link-active"

全局配置 默认的激活的 class。参考 router-link。

  1. linkExactActiveClass
  • 类型: string

  • 默认值: "router-link-exact-active"

全局配置 默认的精确激活的 class。可同时翻阅 router-link。

  1. scrollBehavior

路由进入页面后的滚动

  • 类型: Function

Vue Router API

31a1045071a80f42cb32881d8ebb052c.png
关注不迷路
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值