前言
Vue官方提供了一个vue-router作为跳转链接组件之间,为何不能使用a标签实现组件跳转链接,以及vue-router怎么使用,怎么实现传参,有哪些需要注意的地方,本篇将开启vue-router的介绍。
vue-router是什么
vue-router是路由,这里的路由是SPA(单页面 全称:single page application)路径管理器。
vue-router是Vue.js官方路由插件,它和Vue.js是深度集成的,用于构建单页面应用。Vue单页面应用是基于路由和组件,路由设定为访问路径,并将路径和组件映射起来。在传统的页面应用中,使用一些超链接实现页面切换跳转;而vue-router单页面应用中,是路径间的切换,也就是组件间的切换。路由模块本质,是建立url和页面之间的映射关系。
为何不能使用a标签。
Vue都是单页面应用,在项目打包时,运行npm build就会生成一个dist文件夹,这里面只有静态资源和一个index.html页面,因此必须使用vue-router实现页面跳转。
vue-router实现原理
SPA单页面应用,只有一个完整页面;页面在加载时,不会加载整个页面,只是更新某个指定容器里的内容。vue-router实现单页面应用路由,提供两个方式:history模式与hash模式,根据参数mode区分使用哪一种方式。SPA核心是更新视图,不重新请求页面。
history模式
配置:
1 | const router = new VueRouter({ |
只需要在路由配置项中添加参数mode设置成history即可。
这种模式和传统url路由看起来没有任何区别,比如:(http://xxx.com/course/courseId)。
需要注意的是:需要后端配合,使用正确的配置;否则,访问会返回404。大部分情况设置成:如果url输入错误或者匹配不到任何静态资源,就自动跳转到首页。
histroy模式采用H5 history interface新增的pushState()方法与replaceState()方法;
这两种方法应用于浏览器记录栈,当前浏览器已有的back/forward/go功能基础上,它们提供了对历史记录修改功能。当它们执行修改时,改变当前url,浏览器不会立即向后端发送请求。
hash模式
配置:
1 |
|
只需要在路由配置项中添加参数mode设置成hash即可。
这种模式和传统url路由看起来有区别,会在url后天添加“ # ”符号后跟一串hash值,
比如:http://xxx.com/course/courseId#hash值。
vue-router默认设置成hash模式。使用url的hash模拟一个完整的url,当url发生变化时,页面不会重新加载。“ # ”是页面中的一个位置,是一个锚点;改变后面的hash值,浏览器只会滚动到相应位置,不会重新加载页面。也就是说hash出现在url中,不会被包含在http请求中,对后端完全没有影响,改变url不会重新加载页面。
每一次改变hash值,都会在浏览器的访问历史中增加一条记录,点击返回按钮,就能回到上一个位置;hash模式是通过不同的锚点值,渲染指定DOM位置的不同数据。hash模式的原理使用onhashchange事件监听hash值的变化,可以在window对象上监听这个事件。
vue-router使用
使用Vue官网提供的vue-cli脚手架。
在src目录下创建一个router文件夹,在该文件夹下创建一个index.js存放路由。
1 | // index.js |
引入router,注册路由到整个应用都有路由功能。
1 | // app.js |
模版中使用
1 | <template> |
router-view表示路由匹配到的组件在该地方展示。
vue-router样式选中:
- 在配置项中添加linkActiveClass选项。
1 | // ... |
- 在router-link中写入active-class。
1 | <router-link class="active-class" to="/teacher/courselist"> router </router-link> |
这样书写会出现一个问题,只要以to开头的都会激活选中样式。
比如:
1 | <router-link to="/" class="active-class"> router </router-link> |
可以使用exact属性精确匹配模式解决。
1 | <router-link to="/" class="active-class" exact> router <router-link> |
表示这个链接只会在地址为 / 时被激活。
路由重定向
也是通过routes配置完成;重定向的目标可以是一个命名的路由;可以是一个方法,动态返回重定向目标。
1 | new VueRouter({ |
路由传参
- 使用to
1 | // 定义 |
可以给路由取个name属性名字,代表当前路由;:courseId表示动态参数,teacherId表示静态参数
页面传参
1 | this.$router.push({ |
获取参数
1 | {{ this.$route.params.courseId }} |
特点:参数拼接在后面,丑陋;而且暴露信息。
- 使用params
1 | // 定义 |
页面传参
1 | this.$router.push({ |
获取参数
1 | {{ this.$route.params.courseId }} |
特点:页面刷新后面参数会丢失。
- 使用query
1 | // 定义 |
页面传参
1 |
|
获取参数
1 | {{ this.$route.query.courseId }} |
特点:不会在后面拼接参数,页面刷新参数不会丢失。
$route与$router
$route是路由信息对象,包括:path,name,params,query,hash等。
$route.path:表示当前路由的路径,解析为绝对路径;如:/list。
$route.name:表示当前路径名称。
$route.params:表示当前路由参数,是一个key/value对象,包含动态参数和静态参数;没有查询到是一个空对象。
$route.query:表示当前路由参数,是一个key/value对象,包含动态参数和静态参数;没有查询到是一个空对象。
$route.hash:表示当前路由的hash值;没有hash值,是个空字符串。
$router是路由实例对象,使用new VueRouter创建的实例,包括:路由跳转方法,钩子函数等。
常见的路由跳转方式:
$router.go(-1);表示跳转到上一次浏览的页面。
$router.replace(‘/teacher/couselist’);表示跳转该指定地址。
$router.replace({name:’TeacherPCCourseList’ });使用name属性跳转该指定地址。
$router.push(‘/teacher/courselist’);表示跳转该指定地址。
$router.push({ name: ‘TeacherPCCourseList’ });使用name属性进行跳转该指定地址。
$router.replace与$router.push区别:
使用replace方法不会向浏览器history栈添加新记录,而是替换当前history栈中的记录;当replace跳转到页面后,使用浏览器后退按钮不能查看之前的页面。
使用push方法会向浏览器history栈添加新记录,使用浏览器后退按钮能查看之前的页面。