本文的学习来自技术胖大神的教程:https://jspang.com/
这里的路由是指SPA(单页应用)的路径管理器。vue-router就是WebApp的链接路径管理系统。
为什么不能直接用<a></a>标签编写链接呢?因为用Vue做的都是单页应用,相当于只有一个主的index.html页面,所以写<a></a>标签是不起作用的,必须用vue-router来进行管理。
1安装并写一个简单的路由
在项目目录下执行:
npm install vue-router --save-dev
因为当安装vue-cli环境时,默认安装好了路由,就不用再重复安装了。
1.1解读router/index.js文件
(为代码加了注释):
import Vue from 'vue' //引入Vue import Router from 'vue-router' //引入vue-router import HelloWorld from '@/components/HelloWorld' //引入根目录下的Hello.vue组件 Vue.use(Router) //Vue全局使用Router export default new Router({ routes: [ //配置路由,这里是个数组 { //每一个链接都是一个对象 path: '/', //链接路径 name: 'HelloWorld', //路由名称 component: HelloWorld //对应的组件模板 } ] })
1.2增加一个Hi的路由和页面
在components中新建一个Hi.vue的文件:
<template> <div> <h2>{{msg}}</h2> </div> </template> <script> export default { name: 'Hi', data () { return { msg: '这里是Hi页面' } } } </script> <style> </style>
在router/index.js中配置路由:
import Vue from 'vue' import Router from 'vue-router' //引入vue-router import HelloWorld from '@/components/HelloWorld' //引入根目录下的Hello.vue组件 import Hi from '@/components/Hi' //引入根目录下的Hi.vue组件 Vue.use(Router) //Vue全局使用Router export default new Router({ routes: [ //配置路由,这里是个数组 { //每一个链接都是一个对象 path: '/', //链接路径 name: 'HelloWorld', //路由名称 component: HelloWorld //对应的组件模板 }, { path: '/Hi', name: 'Hi', component: Hi } ] })
浏览器中在url后面加入/Hi,http://localhost:8080/#/Hi
1.3做一个导航
在App.vue中加入
<router-link to="/">首页</router-link> <router-link to="/Hi">Hi</router-link>
router-link就相当于<a>标签
这样就加好了:
2 vue-router配置子路由
子路由就是主栏目下面的分栏目,怎么配置路径。
实例:
1)在App.vue中增加两个导航
<router-link to="/hi/son1">子栏目1</router-link> <router-link to="/hi/son2">子栏目2</router-link>
2)在Hi.vue中加上
<router-view></router-view>
3)建立son1.vue和son2.vue文件
<template> <div> <h2>{{msg}}</h2> </div> </template> <script> export default { name: 'son1', data () { return { msg: 'son1' } } } </script> <style> </style>
4)配置router/index.js
import Vue from 'vue' import Router from 'vue-router' import HelloWorld from '@/components/HelloWorld' import Hi from '@/components/Hi' import son1 from '@/components/son1' import son2 from '@/components/son2' Vue.use(Router) export default new Router({ routes: [ { path: '/', name: 'HelloWorld', component: HelloWorld }, { path: '/Hi', name: 'Hi', component: Hi, children:[ { path: 'son1', name:'Hi/son1', component: son1 }, { path: 'son2', name:'Hi/son2', component: son2 } ] } ] })
3参数传递
参数传递一个最基本的需求。
3.1用name传递参数
在rouder/index.js中定义了name,在模板中用$route.name调用。这种方式不常用。
例:在App.vue中加一个面包屑:
<p>当前页面是:{{$route.name}}</p>
效果:
3.2通过<router-link> 标签中的to传参
对to进行绑定,然后用$route.params接收
App.vue:
<router-link :to="{name:'Hi/son1',params:{username:'子栏目的名字',id:'666'}}">子栏目1</router-link>
son1.vue:
<div>username是:{{$route.params.username}},id为:{{$route.params.id}}</div>
4单页面多路由区域操作
如果有多个<router-view></router-view>
1)App.vue:
<router-view></router-view> <router-view name="left"></router-view> <router-view name="right"></router-view>
2)新建left.vue和right.vue
3)router/index.js:
components: { default:HelloWorld, left:left, right:right }
4)想让left和right调换一下:
App.vue:
<router-link to="/change">调换</router-link>
rouder/index:
{ path: '/change', name: 'change', components: { default:HelloWorld, left:right, right:left } },
5利用url传递参数
以前在前后端没有分开开发的时候,经常用URL传递参数。在实际开发也是有很多用URL传值的需求。比如在新闻列表中有很多新闻标题整齐的排列,点击每个新闻标题打开不同的新闻内容,这时在跳转路由时跟上新闻编号就十分实用。
例:
在router/index.js中配一个专门传递参数的路径,在path中用冒号绑定:
path:'/params/:newsId/:newsTitle',
在App.vue中加入链接:
<router-link to="/params/18/title">新闻标题</router-link>
用$route.params接收参数
可以在参数配置时加上正则,写在括号里。限制传递的格式:
例如:必须是数字才能传递:
path:'/params/:newsId(\\d+)/:newsTitle'
这时如果不是数字的参数就无法传递了:
可以看到值没有接收到。
6 vue-router 的重定向-redirect
router/index:
{ path:'/goHome', redirect:'/' }
App.vue:
<router-link to="/goHome">goHome</router-link>
重定向时想传递传数:
router/index:
{ path:'/goParams/:newsId/:newsTitle', redirect:'/params/:newsId/:newsTitle' }
App.vue:
<router-link to="/goParams/20/title hello">goParams</router-link>
7 alias别名的使用
别名和重定向差不多,但有一些细微的区别,
配置路由:
{ path:'son1', component: son1, alias:'/otherName' },
写链接:
<router-link to="/otherName">otherName</router-link>
redirect和alias的区别:
redirect:直接改变了url的值,把url变成了真实的path路径。
alias:URL路径没有改变,这种情况更友好,让用户知道自己访问的路径,只是改变了<router-view>中的内容。
8路由的过渡动画
在路由切换时可以增加一些动效。
在router-view的外面,加一个父标签transition,必写属性name。
8.1四种类名
有四种css类名,前缀就是transition的name属性,如果name=”fade”, 那么:
fade-enter:进入过渡的开始状态,元素被插入时生效,只应用一帧后立刻删除。
fade-enter-active:进入过渡的结束状态,元素被插入时就生效,在过渡过程完成后移除。
fade-leave:离开过渡的开始状态,元素被删除时触发,只应用一帧后立刻删除。
fade-leave-active:离开过渡的结束状态,元素被删除时生效,离开过渡完成后被删除。
fade-enter-active和fade-leave-active在整个进入或离开过程中都有效,所以CSS的transition属性在这两个类下进行设置。
8.2过渡模式mode
in-out:新元素先进入过渡,完成之后当前元素过渡离开。
out-in:当前元素先进行过渡离开,离开完成后新元素过渡进入。
例:
<transition name="fade" mode="out-in"> <router-view></router-view> </transition>
css:
.fade-enter{opacity: 0;} .fade-enter-active{transition: opacity .5s;} .fade-leave{opacity: 1;} .fade-leave-active{opacity: 0;transition: opacity .5s;}
这样就做成了一个淡入淡出的效果。
9 mode的设置
在浏览器预览页面时,url中有一个#号,
不想显示这个#号,加上mode就可以了,
mode:'history',
mode有两种模式,history和hash,hash就是带着#号的。
10 404页面
把path配置成*就可以了。
例:
router/index.js: import Error from '@/components/Error' { path:'*', component: Error },
App.vue:
<router-link to="/121212121">一个错误的路径</router-link>
11路由中的钩子
路由的钩子选项可以写在路由配置文件中,也可以写在组件模板中。
11.1在路由配置文件(router/index.js)中写钩子函数
在路由文件中只能写一个beforeEnter,就是在进入此路由配置时
router/index.js:
beforeEnter:(to,from,next)=>{ console.log(to); console.log(from); next(); }
可以看到,to和from都是对象,里面有一些有用的数据。
三个参数:
to:路由将要跳转的路径信息,信息是包含在对像里边的。
from:路径跳转前的路径信息,也是一个对象的形式。
next:路由的控制参数,常用的有next(true)和next(false)。
next(true)就是进行跳转,next(false)不进行跳转,不写也是不跳转。
如果不写next(),
可以看到,没有跳转到相应页面。
11.2写在模板中的钩子函数
在配置文件中的钩子函数,只有一个钩子beforeEnter。写在模板中就可以有两个钩子函数:
beforeRouteEnter:在路由进入前的钩子函数。
beforeRouteLeave:在路由离开前的钩子函数。
写在模板里的路由钩子函数,可以监控到路由的进入和路由的离开,也可以轻易的读出to和from的值。
beforeRouteEnter:(to,from,next)=>{ console.log('进入路由模板'); next(); }, beforeRouteLeave:(to,from,next)=>{ console.log('离开路由模板'); next(); }
12编程式导航
编程式导航就是在业务逻辑代码中需要跳转页面,就是在业务逻辑代码中实现导航。
例:前进和后退
<button @click="goBack">后退</button> <button @click="goForward">前进</button> methods:{ goBack(){ this.$router.go(-1); }, goForward(){ this.$router.go(1); } },
例:跳转到某个页面
<button @click="goHi">跳转到Hi页面</button> goHi(){ this.$router.push('/Hi'); }
来源:https://www.cnblogs.com/hzhjxx/p/12046180.html