使用

  1. 路由的安装:npm install vue-router --save 也可以在安装脚手架进行选择
  2. src中创建router文件夹里面创建一个index.js

index.js

  1. //配置路由相关信息
  2. //引入Vue
  3. import Vue from 'vue'
  4. //1.导入路由插件
  5. import VueRouter from 'vue-router'
  6. //2.通过Vue.use(插件),安装插件
  7. Vue.use(VueRouter);
  8. //3.引入自己写的组件
  9. import Home from '../components/Home.vue'
  10. import About from '../components/About.vue'
  11. //4.创建VueRouter对象
  12. const router = new VueRouter({
  13. //配置路由和组件之间的映射关系
  14. routes:[
  15. {//每个路径是一个路径 path属性写路径 component显示的组件
  16. path:'/home',
  17. component:Home,
  18. },
  19. {
  20. path:'/about',
  21. component:About,
  22. }]
  23. });
  24. //3.将router对象传入vue实例中
  25. export default router;

Home.vue和About.vue组件

  1. components文件夹下
  2. //Auout.vue
  3. <template>
  4. <div>
  5. <h2>我是关于</h2>
  6. <p>呵呵呵</p>
  7. </div>
  8. </template>
  9. <script>
  10. export default {
  11. name:"About"
  12. }
  13. </script>
  14. <style scoped></style>
  15. //Home.vue
  16. <template>
  17. <div>
  18. <h2>我是首页</h2>
  19. <p>哈哈哈</p>
  20. </div>
  21. </template>
  22. <script>
  23. export default {
  24. name:"Home"
  25. }
  26. </script>
  27. <style scoped></style>

App.vue

  1. <template>
  2. <div id="app">
  3. //router-link 在router组件中 由于在index.js以注册进vue直接使用即可 会被渲染成a标签 to写路径
  4. <router-link to="/home">首页</router-link>
  5. <router-link to="/about">关于</router-link>
  6. //router-view 相当于占位 点击上面两个标签 显示的内容会展示在router-view的位置
  7. <router-view></router-view>
  8. </div>
  9. </template>
  10. <script>
  11. export default {
  12. name: 'App',
  13. }
  14. </script>
  15. <style></style>

main.js

  1. import Vue from 'vue'
  2. import App from './App.vue'
  3. //将router对象导入进来
  4. import router from './router/index.js'
  5. Vue.config.productionTip = false
  6. new Vue({
  7. router,
  8. render: h => h(App)
  9. }).$mount('#app')

设置重定向

  1. routers数组中 //当访问/的时候默认跳到/home
  2. {
  3. path:'/',
  4. redirect:'/home'
  5. }

修改url模式

  1. const router = new VueRouter({
  2. //配置路由和组件之间的映射关系
  3. routes: [
  4. {//每个路径是一个路径 path属性写路径 component显示的组件
  5. path: '/home',
  6. component: Home,
  7. },
  8. {
  9. path: '/about',
  10. component: About,
  11. },
  12. {
  13. path: '/',
  14. redirect: '/home'
  15. }
  16. ],
  17. mode:'history',//默认是hash url带#通过mode属性修改为history url路径就不带#号了
  18. });

router-link

  1. <router-link to =""></router-link> to属性 用于指定跳转路径
  2. <router-link tag =""></router-link> tag属性 用于指定渲染成什么标签 默认a标签
  3. <router-link replace></router-link> replace属性 没有值 设置后退键不能返回到上个页面
  4. <router-link active-class =""></router-link> active-class属性 当路由匹配成功后会默认给当前元素增加一个router-link-activeclass 可以通过active-class进行重新设置

通过代码实现跳转

  1. <template>
  2. <div id="app">
  3. <button @click="homeClick">首页</button>
  4. <button @click="aboutClick">关于</button>
  5. <router-view></router-view>
  6. </div>
  7. </template>
  8. <script>
  9. export default {
  10. name: 'App',
  11. methods:{
  12. homeClick(){
  13. this.$router.push('home');//跳转后可以后退
  14. this.$router.replace('/home')//跳转后不可以后退
  15. },
  16. aboutClick(){
  17. this.$router.push('about');
  18. this.$router.replace('/about')
  19. }
  20. }
  21. }
  22. </script>

动态路由的使用

  1. router设置
  2. {
  3. path:'/user/:userId',//通过:userId进行占位 在对应组件中通过 this.$route.userId变化的值
  4. component:User
  5. },
  6. 给占位赋值
  7. <div id="app">
  8. <router-link :to="'/user/'+userId">用户</router-link> //进行绑定的方式引用data的值
  9. <router-view></router-view>
  10. </div>
  11. </template>
  12. <script>
  13. export default {
  14. name: 'App',
  15. data(){
  16. return{
  17. userId:"zhangsan"
  18. }
  19. }
  20. }
  21. </script>
  22. <template>
  23. <div>
  24. <h2>用户界面</h2>
  25. <p>相关信息</p>
  26. <h2>{{userId}}</h2> $route.params.userId 可以直接获取 不用通过计算属性
  27. </div>
  28. </template>
  29. <script>
  30. export default {
  31. name:'User',
  32. computed:{
  33. userId(){
  34. $route$router不同 $router是获取的路由 $route获取的是刚点击的路由也就是活跃的路由
  35. return this.$route.params.userId;//获取变化的值 userId是在路由中设置的占位
  36. }
  37. }
  38. }
  39. </script>

路由的懒加载

  1. router文件下
  2. {
  3. path: '/about',
  4. component:()=>import('../components/About.vue')
  5. },

路由的嵌套

  1. 比如在/home页面中 通过/home/news访问其他一些内容
  2. const router = new VueRouter({
  3. routes: [
  4. {
  5. path: '/home',
  6. component: () => import('../components/Home.vue'),
  7. children: [//设置子路径
  8. {
  9. path:'/',
  10. redirect:'new'//设置进入home路径默认选择的子路径
  11. },
  12. {
  13. path: 'new',//不要加/new
  14. component:()=>import('../components/HomeNew.vue'),
  15. }
  16. ],
  17. },
  18. ],
  19. });
  20. Home.vue
  21. <template>
  22. <div>
  23. <h2>你好 home</h2>
  24. <router-link to="/home/new">new</router-link>
  25. <router-view></router-view>
  26. </div>
  27. </template>

参数传递

  1. 两种方式
  2. params的类型
  3. 配置路由格式 :/router/:id
  4. 传递方式:在path后跟上对应值//动态路由的使用
  5. 格式:/router/123
  6. <router-link :to="'/user/' + userId">用户</router-link>
  7. 获取:{{$route.params.userId}}
  8. query的类型
  9. 配置路由的格式:/router
  10. 传递方式 对象中使用querykey作为传递方式
  11. 格式:/router?id=123
  12. 实现:<router-link :to="{path:'/about', query:{id:123}}">关于</router-link>
  13. //绑定to属性通过对象的方式传递路径和参数
  14. 获取:{{$route.query.id}}
  15. 代码跳转传递参数
  16. methods: {
  17. homeClick() {params的类型
  18. this.$router.push("/user/" + "111");
  19. },
  20. aboutClick() {query的类型
  21. this.$router.push({ path: "/about", query: { id: 123}});
  22. }
  23. }

导航守卫

路由全局守卫

  1. 实现需求 跳转到/home 将页面的title改为首页
  2. {
  3. path: '/home',
  4. meta:{
  5. title:"首页"
  6. },
  7. component: () => import('../components/Home.vue'),
  8. },
  9. 设置:通过路由的meta:{} 属性设置信息 meta:{key,value}
  10. 获取:通过路由对象的beforeEach方法
  11. router.beforeEach((to, from, next) => {
  12. to:路由到的地方
  13. from:从哪个路由来 from路由到to路由
  14. next:是方法 必须调用 用来向下执行的 next();可以指定路径可以做登录判断使用 next({path:"/"})
  15. next(false) 可以中断向下执行
  16. to.meta.key的方式获取设置的值
  17. to.matched获取的是当前路由下全部meta 上面如果嵌套路由只能获取到子路由设置的meat中设置的属性
  18. to.matched[0]获取当前路由的第一个meta也就是父路由
  19. document.title = ;
  20. next();
  21. })

路由独享守卫

  1. {
  2. path: '/about',
  3. meta: {
  4. title: "关于"
  5. },
  6. component: () => import('../components/About.vue'),
  7. beforeEnter(to,from,next){
  8. console.log();
  9. next();
  10. }
  11. },

组件内守卫

  1. export default {
  2. name: "App",
  3. beforeRouteEnter (to, from, next) {
  4. // 在渲染该组件的对应路由被 confirm 前调用
  5. // 不!能!获取组件实例 `this`
  6. // 因为当守卫执行前,组件实例还没被创建
  7. next(vm => {
  8. // 通过 `vm` 访问组件实例
  9. })
  10. },
  11. beforeRouteUpdate (to, from, next) {
  12. // 在当前路由改变,但是该组件被复用时调用
  13. // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
  14. // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
  15. // 可以访问组件实例 `this`
  16. },
  17. beforeRouteLeave (to, from, next) {
  18. // 导航离开该组件的对应路由时调用
  19. // 可以访问组件实例 `this`
  20. }
  21. }

通过遍历获取router中的内容动态显示内容

router.js

  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. Vue.use(Router)
  4. //导入Login.vue模块
  5. const Login = () => import("./views/Login");
  6. const Home = () => import("./views/Home");
  7. const Test1 = () => import("./views/Test1");
  8. const Test2 = () => import("./views/Test2");
  9. const routes = [
  10. //Login
  11. {
  12. path: "/",
  13. name: "Login",
  14. component: Login,
  15. hidden:true
  16. },
  17. //Home
  18. {
  19. path: "/home",
  20. name: '导航一',
  21. component: Home,
  22. children: [
  23. //Test1
  24. {
  25. path: "/test1",
  26. name: '选项一',
  27. component: Test1
  28. },
  29. //Test2
  30. {
  31. path: "/test2",
  32. name: '选项二',
  33. component: Test2
  34. },
  35. ]
  36. },
  37. ]
  38. export default new Router({
  39. mode: 'history',
  40. base: process.env.BASE_URL,
  41. routes
  42. })

Home.vue

  1. <el-menu router> //router 开启路由模式 开启路由模式后不需要设置点击事件只需要绑定index 就会自动跳转到index设置的路径中去
  2. <el-submenu index="1"
  3. v-for="(item,index) in this.$router.options.routes" <!--this.$router.options.routes 获取全部的路由 进行遍历-->
  4. :key="index"
  5. v-if="!item.hidden"> <!--item.hidden hiden自定义的属性 来控制那个不显示-->
  6. <template slot="title">
  7. <i class="el-icon-location"></i>
  8. {{item.name}} <!--item.name 获取路由中设置的name-->
  9. </template>
  10. <el-menu-item-group>
  11. <el-menu-item v-for="(children,indexj) in item.children" <!--item.children 获取路由中的子路由-->
  12. :index="children.path" <!--child ren.path获取路由设置的路径 给index进行绑定 --> index 在这设置的
  13. :key="indexj">
  14. {{children.name}} <!--children.name获取路由设置的名字-->
  15. </el-menu-item>
  16. </el-menu-item-group>
  17. </el-submenu>
  18. </el-menu>

将对象转化成路由对象

两种方式都是路由懒加载的方式 通常第二种常用 第一种可以在对象中直接进行判断 第二种需要在对象中判断在加入进去

方式一

  1. let fmRouter = {
  2. path: routers.path,
  3. name: routers.name,
  4. icoCls: routers.icoCls,
  5. children: routers.children,
  6. component(resolve) {
  7. if (routers.component.startsWith("Home")) {
  8. require(['../views/' + routers.component + '.vue'],resolve)
  9. } else if (routers.component.startsWith("Emp")) {
  10. require(['../views/emp/' + routers.component + '.vue'],resolve)
  11. } else if (routers.component.startsWith("Per")) {
  12. require(['../views/per/' + routers.component + '.vue'],resolve)
  13. } else if (routers.component.startsWith("Sal")) {
  14. require(['../views/sal/' + routers.component + '.vue'],resolve)
  15. } else if (routers.component.startsWith("Sta")) {
  16. require(['../views/sta/' + routers.component + '.vue'],resolve)
  17. } else if (routers.component.startsWith("Sys")) {
  18. require(['../views/sys/' + routers.component + '.vue'],resolve)
  19. }
  20. }
  21. }

方式二

  1. function msyformateRouter(myformateRouter) {
  2. let res = [];
  3. for (let i = 0; i < myformateRouter.length; i++) {
  4. let routers = myformateRouter[i]
  5. if (routers.children && routers.children != null) {
  6. routers.children = msyformateRouter(routers.children)
  7. }
  8. let fmRouter = {
  9. path: routers.path,
  10. name: routers.name,
  11. icoCls: routers.icoCls,
  12. children: routers.children,
  13. component: null
  14. }
  15. if (routers.component.startsWith("Home")) {
  16. fmRouter.component = () => import('../views/' + routers.component + '.vue')
  17. } else if (routers.component.startsWith("Emp")) {
  18. fmRouter.component = () => import('../views/emp/' + routers.component + '.vue')
  19. } else if (routers.component.startsWith("Per")) {
  20. fmRouter.component = () => import('../views/per/' + routers.component + '.vue')
  21. } else if (routers.component.startsWith("Sal")) {
  22. fmRouter.component = () => import('../views/sal/' + routers.component + '.vue')
  23. } else if (routers.component.startsWith("Sta")) {
  24. fmRouter.component = () => import('../views/sta/' + routers.component + '.vue')
  25. } else if (routers.component.startsWith("Sys")) {
  26. fmRouter.component = () => import('../views/sys/' + routers.component + '.vue')
  27. }
  28. res.push(fmRouter);
  29. }
  30. return res;
  31. }

keep-alive

  1. keep-aliveVue内部定义的组件 可以使被包含的组件保留状态 或避免重新渲染
  2. <keep-alive inclue=""></keep-alive>
  3. include="组件的name" 字符串或正则 只有匹配的组件才会被缓存 多个通过,隔开
  4. exclude="组件的name" 字符串或正则 匹配到的组件不会被缓存