vue router重要知识点整理

519 阅读6分钟

这篇博客记录了vue router使用过程中常用和需要掌握的点的知识点和具体用法,希望能对你有所帮助,欢迎交流。

一.子路由

子路由指的是路由页面里面的路由 路由到的页面里面还有一个


<template>
  <div>
    <div>user</div>
    <!--子路由在此-->
    <router-view class="aaa"></router-view>
  </div>
</template>

<script>
export default {};
</script>

<style lang="less">
</style>
import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'
import Login from '../views/User/login.vue'
import Register from '../views/User/register.vue'
import User from '../views/user.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },

  {
    path: '/user',
    // name: 'Home',
    component: User,
    children: [
      {
        path: '/',
        component: User
      },
      {
        path: 'login',
        component: Login
      },
      {
        path: 'register',
        component: Register
      }
    ]
  },

  {
    path: '/about',
    name: 'About',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
  }
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

export default router

路由配置先到某一级路由 这个路由先有自己的组件,如果不访问子路由则访问的直接是该组件,如果有配置子路由:
/ 对应的还是该组件 里面的还是该组件;
/xxx 对应组件里面要替换的组件;
从这个角度其实子路由就是子组件的路由

思考

普通tab如果内部独立性强适合划分大模块 也可以考虑使用路由实现

二.vue-router 的参数传递

两种方法

1.使用name

在路由组件内使用 $router.name可获取在router.js配置的该路由组件的name

2.使用params

在标签配置动态的to属性

 <router-link :to="{name: 'login',params:{userName: 'lj'}}">login</router-link>

获取的时候 在对应的路由组件内使用

    <div>{{$route.params.userName}}</div>

即可获取到传来的参数

三.单页面多路由区域操作

可以起不同的名字来做区分

<router-view />
<router-view name="left" style="float:left;width:50%;background-color:#ccc;height:300px;"></router-view>
<router-view name="right" style="float:right;width:50%;background-color:#c0c;height:300px;"></router-view>

再将不同的路径对应匹配到多个不同的

{
    path: '/',
    components: {
        default: Home,
        left: Login,
        right: Register
    }
},

 {
    path: '/about',
    components: {
      default: Home,
      left: Register,
      right: Login
    }
  }

四.通过url传参

其实本质上还是路径的匹配, 在router.js里面可以给path中某一层的路径配置为可传递参数的形式

{
    path: '/user',
    // name: 'Home',
    component: User,
    children: [
      {
        //子组件是自己本身
        path: '/',
        name: 'UserHere',
        component: User
      },
      {
        //还是正常匹配路劲  所唯一不同的是这里第一层必须为login,第二层和第三层随便什么字符串都可以 就能将对应层的字符串映射到newsId newsTitle这两个变量中
        //和原来唯一不同的是 原来每一层路径都是写死的  现在可以通过支持变量传参的形式 在匹配路径的同时(带:的路径可以匹配任何字符串),实现传参
        path: 'login/:newsId/newsTitle',
        name: 'login',
        component: Login
      },
      {
        path: 'register',
        name: 'uuuuu',
        component: Register
      }
    ]
  },

使用如下将newsTitle作为参数传给了newsTitle参数

如果修改原来最后一个变量为固定的 它将失去传值的功能

 {
    path: '/user',
    // name: 'Home',
    component: User,
    children: [
      {
        //子组件是自己本身
        path: '/',
        name: 'UserHere',
        component: User
      },
      {
        //还是正常匹配路劲  所唯一不同的是这里第一层必须为login,第二层和第三层随便什么字符串都可以 就能将对应层的字符串映射到newsId newsTitle这两个变量中
        //和原来唯一不同的是 原来每一层路径都是写死的  现在可以通过支持变量传参的形式 在匹配路径的同时(带:的路径可以匹配任何字符串),实现传参
        path: 'login/:newsId/newsTitle',
        name: 'login',
        component: Login
      },
      {
        path: 'register',
        name: 'uuuuu',
        component: Register
      }
    ]
  },

五.路由的重定向 rdirecte

在route.js中 对应path下指定redirect到某个新路径就可以,它的特点是可以实现路径上看到效果的切换

{
    path: '/goBack',
    redirect: '/'
}

六.路由的别名 alias

为某一个路径起一个别名,匹配到别名的路径和匹配到真实路劲的效果一致。 如:

{
    path: '/about',
    component: About,
    alias: '/uuuuu/test'
},

这样访问about 和访问 /uuuuu/test效果都是一样的,起了个别名

别名和redirect的不同在于:

alias: 不同的名字而已,在路径上看得到别名的访问

redirec:已重定向到原始路由 在路径上看不到当前的访问路径

七.路由的过渡动画

可以使用来实现过渡动画

<!--注意这里使用的 mode="out-in" 先出去再进来-->
<transition name="fade" mode="out-in">
  <router-view />
</transition>
.fade-enter {
  opacity: 0;
}
.fade-leave {
  opacity: 1;
}
.fade-enter-active {
  transition: opacity 0.5s;
}
.fade-leave-active {
  opacity: 0;
  transition: opacity 0.5s;
}

八.mode选择

VueRouter提供两种模式hash 和 history

const router = new VueRouter({
  mode: 'history',
  // mode: 'hash',
  base: process.env.BASE_URL,
  routes
})

1.hash在访问时路由相关会有前缀# 因为这的确是单页面的

2设置history就可以像路径一样访问

九.设置404的处理页面

在router.js 中配制

{
    path: '*',
    component: Error
}

之后在routes中没有能够正常匹配到的路径都会走到这里,让不存在的路径走到404 这里估计*是匹配所有的路径的,如果有确切的路劲实现就走确切的实现,如果没有就会走到*的指定

十.路由中的钩子

1.钩子函数可以在配置能文件中写, 在配置文件中只能写一个beforeEnter

{
    path: '/user',
    // name: 'Home',
    component: User,
    beforeEnter: (to, from, next) => {
      console.log("to", to, "from", from, "next", next);
      // next()
    },
    children: [
      {
        //子组件是自己本身
        path: '/',
        name: 'UserHere',
        component: User
      },
      {
        //还是正常匹配路劲  所唯一不同的是这里第一层必须为login,第二层和第三层随便什么字符串都可以 就能将对应层的字符串映射到newsId newsTitle这两个变量中
        //和原来唯一不同的是 原来每一层路径都是写死的  现在可以通过支持变量传参的形式 在匹配路径的同时(带:的路径可以匹配任何字符串),实现传参
        path: 'login/:newsId/:newsTitle',
        name: 'login',
        component: Login
      },
      {
        path: 'register',
        name: 'uuuuu',
        component: Register
      }
    ]
  },

里面三个参数 to from next
1.to:路由将要跳转的路径信息,信息是包含在对像里边的。
2.from:路径跳转前的路径信息,也是一个对象的形式。
3.next:路由的控制参数,常用的有next(true)和next(false)。
next(false) 和不写一样都不会跳转
next(true) 才会正常进入对应路由页面

2.在路由对应组件内写钩子函数

在组件模板中可以使用两钩子函数 在配置文件的beforeEnter基础上替换钩子的名字为beforeRouteEnter
beforeRouteEnter:在路由进入前的钩子函数。
beforeRouteLeave:在路由离开前的钩子函数。

<template>
  <div class="about">
    <h1>This is an about page</h1>
  </div>
</template>
<script>
export default {
  beforeRouteEnter(to, from, next) {
    console.log("进入about 前");
    console.log("to", to);
    console.log("from", from);
    console.log("next", next);
    next();
  },

  beforeRouteLeave(to, from, next) {
    console.log("离开about 前");
    console.log("to", to);
    console.log("from", from);
    console.log("next", next);
    next();
  }
};
</script>

使用效果

十一.编程式导航

原来的导航是通过来指定,这样只能在模板上控制,显然是不够灵活的,我们需要在业务逻辑的代码中也能够用它

//前进
go() {
  this.$router.go(1);
},
//后退
goBack() {
  this.$router.go(-1);
},
//跳转指定的页面
goHome() {
  this.$router.push("/");
}

注意

在组件中使用的router和route是不一样的
router:全局变量指全局注册的vue-router实例route:当前路由相关信息