摘要:而路由则是使用了中新增的事件和事件。总结这一章主要是介绍了如何使用在中构建我们的前端路由。
系列目录地址一、基础知识概览
第一章 - 一些基础概念(posted at 2018-10-31)
第二章 - 常见的指令的使用(posted at 2018-11-01)
第三章 - 事件修饰符的使用(posted at 2018-11-02)
第四章 - 页面元素样式的设定(posted at 2018-11-05)
第五章 - 计算属性与监听器(posted at 2018-11-08)
第六章 - 按键修饰符的使用(posted at 2018-11-15)
第七章 - Vue 实例的生命周期(posted at 2018-12-13)
二、深入了解 Vue
第八章 - 组件的基础知识(posted at 2019-01-03)
第九章 - 组件基础再探(data、props)(posted at 2019-03-09)
第十章 - 组件间的数据通信(posted at 2019-04-01)
第十一章 - Vue 中 ref 的使用(posted at 2019-04-29)
第十二章 - 使用 Vue Router 实现 Vue 中的前端路由控制(posted at 2019-05-22)
前言前端路由是什么?如果你之前从事的是后端的工作,或者虽然有接触前端,但是并没有使用到单页面应用的话,这个概念对你来说还是会很陌生的。那么,为什么会在单页面应用中存在这么一个概念,以及,前端路由与我们后端的路由有什么异同呢。本章,我们就来简单介绍下前端路由的概念,以及如何在 Vue 中使用 Vue Router 来实现我们的前端路由。
仓储地址:Chapter02-Bronze Build Router in Vue.js
干货合集在传统的多页面应用中,网站的每一个 URL 地址都是对应于服务器磁盘上的一个实际物理文件。例如,当我们访问 www.yousite.com/index.html 这个网址的时候,服务器会自动把我们的请求对应到当前站点路径下面的 index.html 文件,然后再给予响应,将这个文件返回给浏览器。当我们跳转到别的页面上时,毫无疑问则会再重复一遍上面的过程。
但是在单页面应用中,整个项目中只会存在一个 html 文件,当用户切换页面时,只是通过对这个唯一的 html 文件进行动态重写,从而达到响应用户的请求。也就是说,从切换页面这个角度上说,应用只是在第一次打开时请求了服务器(非服务端渲染的单页应用)。
因为访问的页面是并不真实存在的,所以如何正确的在一个 html 文件中展现出用户想要访问的信息就成为单页面应用需要考虑的问题,而对于这一路由问题的解决方案,为了与我们后端传统意义上的路由进行区别,就将此称为前端路由。
一、前端路由的实现方式
目前的前端路由的实现方式主要是通过 hash 路由匹配或者是采用 html5 中的 history api 这两种,也就是说,不管是 hash 路由还是使用 history 路由模式,其实都是基于浏览器自身的特性。
hash 路由:hash 这个概念,可能听起来有些陌生,不过,其实我们在之前的前端开发中,其实是有所接触的。例如,在某些情况下,我们需要定位页面上的某些位置,就像下面的例子中展现的那样,我想要通过点击不同的按钮就跳转到指定的位置,这里我们使用的锚点定位其实就是 hash。
<div id="content">
<div class="btn-container">
<a class="btn" href="#image1">图片1a>
<a class="btn" href="#image2">图片2a>
div>
<img src="./xxx/xxx.jpg" id="image1">
<img src="./xxx/xxx.jpg" id="image2">
div>
hash 路由的本质是浏览器 location 对象中的 hash 属性,它会记录链接地址中 "#" 后面的内容(e.g.:#part1)。因此,我们可以通过监听 window.onhashchange 事件获取到跳转前后访问的地址,从而实现地址切换的目的。
history 路由:在之前的 html 版本中,我们可以通过 history.back(), history.forward()和 history.go() 方法来完成在用户历史记录中向后和向前的跳转。而 history 路由则是使用了 html5 中新增的 pushState 事件和 replaceState() 事件。
通过这两个新增的 API,就可以实现无刷新的更改地址栏链接,配合 AJAX 就可以做到整个页面的无刷新跳转,具体实现的原理大家可以看看这篇文章 =》HTML5 简介(三):利用 History API 无刷新更改地址栏
在 Vue 中,Vue Router 是官方提供的路由管理器。它和 Vue.js 的核心深度集成,因此,不管是采用 hash 的方式还是使用 history api 实现我们的前端路由都有很好的支持,所以这里我们采用 Vue Router 这一组件来实现我们的前端路由。
二、 路由实现
首先我们需要将 Vue Router 添加引用到我们的项目中,这里我还是采用直接引用 js 文件的方式为我们的示例代码添加前端路由支持。
在 Vue 中使用 Vue Router 构建单页面应用,我们只需要将组件 (components) 映射到定义的路由 (routes) 规则中,然后告诉 Vue Router 在哪里渲染它们,并将这个路由配置挂载到 Vue 实例节点上即可。
在 Vue Router 中,我们使用 router-link 标签来渲染链接,当然,默认生成的是 a 标签,如果你想要将路由信息生成别的 html 标签,则可以使用 tag 属性指明需要生成的标签类型。
<router-link to="/home">主页router-link>
<router-link to="/home" tag="button">主页router-link>
可以看到,当我们指定 tag 属性为 button 后,页面渲染后的的标签就变成了 button 按钮。同样的,它还是会监听点击,触发导航。
同时,从上图可以看出,当前的链接地址为 #/home,也就是说,通过 router-link 生成的标签,当页面地址与对应的路由规则匹配成功后,将自动设置 class 属性值为 .router-link-active。当然,我们也可以通过指定 active-class 属性或者在构造 VueRouter 对象时使用 linkActiveClass 来自定义链接激活时使用的 CSS 类名。
<router-link to="/home" active-class="aaaa">主页router-link>
const router = new VueRouter({
routes: [],
linkActiveClass: "aaaaa"
})
当路由表构建完成后,对于指向路由表中的链接,需要在页面上找一个地方去显示已经渲染完成后的组件,这时,我们就需要使用 router-view 标签去告诉程序,我们需要将渲染后的组件显示在当前位置。
在下面的示例代码中,模拟了 Vue 中路由的使用,当访问 #/home 时会进行加载 home 组件,而当链接跳转到 #/account 时则会加载 account 组件。同时,我们可以发现,在 account 组件中又包含了两个子路由,通过点击 account 组件中的子路由地址,从而加载对应的 login 组件和 register 组件。
<script src="../../lib/vue.js">script>
<script src="../../lib/vue-router.js">script>
<style>
.container {
background-color: aquamarine;
margin-top: 20px;
width: 740px;
height: 300px;
}
style>
<div id="app">
<router-link to="/home">主页router-link>
<router-link to="/account">账户router-link>
<div class="container">
<router-view>router-view>
div>
div>
<template id="tmpl">
<div>
<h3> account page h3>
<router-link to="/account/login">登录router-link>
<router-link to="/account/register">注册router-link>
<router-view>router-view>
div>
template>
<script>
// 1、定义路由跳转的组件模板
const home = {
template: " home page "
}
const account = {
template: "#tmpl"
}
const login = {
template: " login page"
}
const register = {
template: " register page"
}
// 2、定义路由信息
const routes = [{
path: "/",
redirect: "/home"
},
{
path: "/home",
component: home
},
{
path: "/account",
component: account,
children: [{
path: "login",
component: login
},
{
path: "register",
component: register
}
]
}
]
const router = new VueRouter({
//mode: "history", //使用 history 模式还是 hash 路由模式
routes
})
// 3、挂载到当前 Vue 实例上
const vm = new Vue({
el: "#app",
data: {},
methods: {},
router: router
});
script>
在上面的代码中,也使用到了嵌套路由和路由的重定向。通过使用路由重定向,我们可以将用户访问网站的根目录 / 时进行重定向到 /home ,而嵌套路由则可以将 URL 中各段动态路径也按某种结构对应到实际嵌套的各层组件。
例如,这里的 login 组件和 register 组件,它们都是位于 account 组件中的,因此,在构建 url 时,我们应该将该地址位于 /account url 后面,从而更好地表达这种关系。所以这里,我们在 account 组件中又添加了一个 router-view 标签,用来渲染出嵌套的组件内容。同时,通过在定义 routes 时在参数中使用 children 属性,从而达到配置嵌套路由信息的目的。
PS:以 / 开头的嵌套路径会被当作根路径,而我们的 login 组件和 register 组件都是包含在 account 中,所以这里直接定义 path 参数即可。
总结这一章主要是介绍了如何使用 Vue Router 在 Vue 中构建我们的前端路由。在实际开发中,对于一个路径,可能会对应到多个组件,这时,如何将多个组件绑定到一个路径下,就是我们需要解决的问题。另外,在实际使用中我们会遇到路由传参,可能会因为 hash 路由不漂亮,从而准备采用 history 路由,对于这些需求的实现,将放在下一章中进行学习。
参考1、从头开始学习vue-router
2、单页面应用路由的两种实现方式
3、你需要知道的单页面路由实现原理
4、面试官: 你了解前端路由吗");
5、前端路由实现原理(history)
占坑作者:墨墨墨墨小宇
个人简介:96年生人,出生于安徽某四线城市,毕业于Top 10000000 院校。.NET程序员,枪手死忠,喵星人。于2016年12月开始.NET程序员生涯,微软.NET技术的坚定坚持者,立志成为云养猫的少年中面向谷歌编程最厉害的.NET程序员。
个人博客:yuiter.com
博客园博客:www.cnblogs.com/danvic712
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/6874.html
摘要:五六月份推荐集合查看最新的请点击集前端最近很火的框架资源定时更新,欢迎一下。苏幕遮燎沈香宋周邦彦燎沈香,消溽暑。鸟雀呼晴,侵晓窥檐语。叶上初阳乾宿雨,水面清圆,一一风荷举。家住吴门,久作长安旅。五月渔郎相忆否。小楫轻舟,梦入芙蓉浦。 五、六月份推荐集合 查看github最新的Vue weekly;请::点击::集web前端最近很火的vue2框架资源;定时更新,欢迎 Star 一下。 苏...
摘要:五六月份推荐集合查看最新的请点击集前端最近很火的框架资源定时更新,欢迎一下。苏幕遮燎沈香宋周邦彦燎沈香,消溽暑。鸟雀呼晴,侵晓窥檐语。叶上初阳乾宿雨,水面清圆,一一风荷举。家住吴门,久作长安旅。五月渔郎相忆否。小楫轻舟,梦入芙蓉浦。 五、六月份推荐集合 查看github最新的Vue weekly;请::点击::集web前端最近很火的vue2框架资源;定时更新,欢迎 Star 一下。 苏...
摘要:可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。我工作中只用到,对和不怎么熟与的区别相同点都支持指令内置指令和自定义指令都支持过滤器内置过滤器和自定义过滤器都支持双向数据绑定都不支持低端浏览器。 看看面试题,只是为了查漏补缺,看看自己那些方面还不懂。切记不要以为背了面试题,就万事大吉了,最好是理解背后的原理,这样面试的时候才能侃侃而谈。不然,稍微有水平的面试官一看就能看出,是...
阅读 2650·2021-11-24 09:39
阅读 1612·2021-09-28 09:35
阅读 1080·2021-09-06 15:02
阅读 1278·2021-07-25 21:37
阅读 2701·2019-08-30 15:53
阅读 3608·2019-08-30 14:07
阅读 697·2019-08-30 11:07
阅读 3487·2019-08-29 18:36