前端路由是在保证只有一个HTML页面的状况下,经过对每一个视图展现形式匹配一个特殊的url来实现所谓的切换效果。不会从新向服务端发送请求,也不会跳转页面。不管是刷新、前进、仍是后退,均可以经过特殊url实现。html
单页web应用(single page web application,SPA)前端
它只有一个HTML页面。它的核心是更新视图不须要从新请求页面。 所谓的页面跳转,多个页面之间的切换是利用JS动态的变换HTML的内容,加载的时候不是加载整个页面,而是某个指定的容器中的内容。vue
举栗子:阿呆有一个水壶,刚开始装的是牛奶,过一下子装的是果汁,再过一会又是开水。可水壶仍是一个水壶!web
SPA的缺点: api
一、没法记住用户的操做记录,浏览器
二、且只有一个url,对SEO不友好。bash
🍓前端路由的重要的做用服务器
一、能够在改变url的时候不会向服务器发送请求。app
二、能够监听到url的改变。ui
export default new Router({
routes: [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/city',
name: 'City',
component: City
},
{
path: '/detail/:id',
name: 'Detail',
component: Detail
},
{
path: '/search',
name: 'Search',
component: Search
}
]
})
复制代码
--hash模式下的url
http://localhost:8080/#/
http://localhost:8080/#/detail/1
复制代码
这里的 hash 就是指 url 后的 # 号以及后面的字符。好比说 "www.baidu.com/#hashhash" ,其中 "#hashhash" 就是咱们指望的 hash 值。 hash 值的变化不会致使浏览器像服务器发送请求,并且
hash 的改变
会触发 hashChange 事件,浏览器的前进后退也能对其进行控制
,因此在 H5 的 history 模式出现以前,基本都是使用 hash 模式来实现前端路由。
如下是我我的项目中的页面跳转 history模式
const router = new Router({
mode: 'history',
base: process.env.BASE_URL,
routes: [
{
path: '/login',
name: 'login',
component: ()=>import('./views/Login.vue'),
},
{
path: '/register',
name: 'register',
component: ()=>import('./views/Register.vue'),
},
{
path: '/information',
name: 'information',
component: ()=>import('./views/Information.vue'),
},
{
path: '/chat',
name: 'chat',
component: ()=>import('./views/ChatView.vue'),
}
]
});
复制代码
在 HTML5 以前,浏览器就已经有了 history 对象。但在早期的 history 中只能用于多页面的跳转。
重要)在 HTML5 的规范中,history 新增了如下几个 API:
history.pushState(); // 添加新的状态到历史状态栈
history.replaceState(); // 用新的状态代替当前状态
history.state // 返回当前状态对象
history.pushState() 和 history.replaceState() 的区别?
history.pushState() 在保留现有历史记录的同时,将 url 加入到历史记录中。 history.replaceState() 会将历史记录中的当前页面历史替换为 url。 因为 history.pushState() 和 history.replaceState() 能够改变 url 同时,不会刷新页面,因此在 HTML5 中的 histroy 具有了实现前端路由的能力。
但须要注意的是,history 在修改 url 后,虽然页面并不会刷新,但咱们在手动刷新,或经过 url 直接进入应用的时候, 服务端是没法识别这个 url 的。
由于咱们是单页应用,只有一个 html 文件,服务端在处理其余路径的 url 的时候,就会出现404的状况。 因此,若是要应用 history 模式,须要在服务端增长一个覆盖全部状况的候选资源:若是 URL 匹配不到任何静态资源,则应该返回单页应用的 html 文件。
popstate
在history模式中与hash模式的hashchange对应的是popState。popstate是在浏览器回退前进或者js的 back() go() forward()方法的时候才会触发。
<button @click="$router.go(-1)">返回</button> //返回上一级
<button @click="$router.back()">返回</button> //返回上一级
<button @click="$router.forward()">返回</button> //切换到下一级
那么你们就会有疑问——若是只能经过js的api才能够触发popState
, 那pushState
和replaceState
怎么被popState
“注意”到?
答案:能够经过a标签改变url,检测到url发生改变。 大体大代码以下:
hash模式和history模式对比
一、hash 模式相比于 history 模式的优势:
二、hash 模式相比于 history 模式的缺点: