前言
当浏览器url地址变化,浏览器都会根据url来请求相对应的html文件,当访问一个不存在的html文件就会报404错误。那么像vue这种单页面就是通过vue-router实现的路由切换
下面介绍一下vue-router的两种模式以及原理
hash模式
http://127.0.0.1:5500/hash-router.html#/about
#后面的内容变化后,浏览器是不会再次请求的。然后通过监听onhashchange
事件即可。
下面是简单的例子
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.main {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
}
.index {
display: none;
background-color: bisque;
}
.about {
display: none;
background-color: brown;
}
</style>
</head>
<body>
<div class="main">
<div class="nav">
<a href="#/index">首页</a>
|
<a href="#/about">关于</a>
</div>
<div class="content">
<div class="index">
<h1>首页</h1>
</div>
<div class="about">
<h1>关于</h1>
</div>
</div>
</div>
<script>
window.onhashchange = (e) => {
const newURL = e.newURL.split('#/')[1]
const oldURL = e.oldURL.split('#/')[1]
document.querySelector(`.${oldURL}`).style.display = 'none'
document.querySelector(`.${newURL}`).style.display = 'block'
}
</script>
</body>
</html>
history模式
http://127.0.0.1:5500/history-router.html
,history模式的url就正常多了,那么url改变后,单页面应用是如何做到不重新请求呢?就是通过history.pushState()
api实现的。
例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.main {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100vh;
}
.index {
display: none;
background-color: bisque;
}
.about {
display: none;
background-color: brown;
}
</style>
</head>
<body>
<div class="main">
<div class="nav">
<a href="javascript:jump('index')">首页</a>
|
<a href="javascript:jump('about')">关于</a>
</div>
<div class="content">
<div class="index">
<h1>首页</h1>
</div>
<div class="about">
<h1>关于</h1>
</div>
</div>
</div>
<script>
function jump(url) {
history.pushState(null, null, `/${url}`)
let pages = document.querySelectorAll('.content > div')
pages.forEach((page) => {
page.style.display = 'none'
})
document.querySelector(`.${url}`).style.display = 'block'
}
</script>
</body>
</html>
面试题
- Vue-Router如何保证URL变化了,页面不会刷新?
因为Vue-Router使用的是history和hash模式
- hash模式通过
onhashchange
监听hash值得变化
history模式通过state来处理(history.pushState / replaceState / popState)
- 后端能拿到URL所有信息吗
不可以。URL信息只在前端可见,Vue-Router通过修改浏览器的URL来管理页面导航,而不是每个页面都像后端请求
当然你可以前端获取url信息,通过参数传递给后端。
- hash是不会导致页面刷新的,那前端是如何拿到hash信息的你知道吗
通过监听
hashChange
事件
小结
单页面应用实现路由主要有两种方案:
onhashchange
监听hash值变化history.pushState
改变url,但不会刷新页面