Vue路由模式中的hash和history模式详细介绍
作者:月光晒了很凉快 发布时间:2024-06-07 15:20:16
1. 路由概念
路由的本质就是一种对应关系,根据不同的URL请求,返回对应不同的资源。那么url地址和真实的资源之间就有一种对应的关系,就是路由。
SPA(Single Page Application)单页面应用程序,基于前端路由而起:整个网站只有一个页面,通过监听地址栏中的变化事件,来通过Ajax局部更新内容信息显示、同时支持浏览器地址栏的前进和后退操作。
前端路由有两种模式:hash 模式和 history 模式。
2. hash模式
概述:
hash 路由模式是这样的:http://xxx.abc.com/#/xx
。 有带#
号,后面就是 hash 值的变化。改变后面的 hash 值,它不会向服务器发出请求,因此也就不会刷新页面。并且每次 hash 值发生改变的时候,会触发 hashchange 事件。因此我们可以通过监听该事件,来知道 hash 值发生了哪些变化。
window.addEventListener('hashchange', ()=>{
// 通过 location.hash 获取到最新的 hash 值
console.log(location.hash);
});
使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hash路由</title>
</head>
<body>
<ul>
<li>
<!-- 通过标签导航 声明式导航 -->
<a href="#/home" rel="external nofollow" >首页</a>
<!-- location.href='#/home' js方式进行导航切换 编程式导航 -->
</li>
<li>
<a href="#/about" rel="external nofollow" >关于</a>
</li>
</ul>
<div id="routerView"></div>
<script>
const routerRender = () => {
// 每次都置空hash
let html = ''
// 根据地址栏hash值的不同返回对应的资源
try {
// 如果hash值为空就给一个home
let hash = location.hash || '#/home'
html = component[hash.slice(2)]()
} catch (error) {
html = `<div>404</div>`
}
// 渲染到页面上
document.getElementById('routerView').innerHTML = html
}
const component = {
home() {
return `<div>home页面</div>`
},
about() {
return '<div>关于页面</div>'
}
}
window.onload = function () {
routerRender()
}
// 事件,监听地址栏中的hash值变化,实现回退
window.addEventListener('hashchange', routerRender)
</script>
</body>
</html>
注意:hash 模式既可以通过声明式导航,也可以通过编程式导航,上面的案例展示的是声明式导航。而下面将要讲到的 history 模式只能通过编程式导航实现,因为 history 是 js 对象。
优缺点:
优点:hash模式兼容性很强,刷新浏览器,页面还会存在
缺点:地址栏不优雅,有#存在,不利于seo,记忆困难
3. history路由模式
概述:
HTML5的History API为浏览器的全局history对象增加了该扩展方法。它是一个浏览器(bom)的一个接口,在window对象中提供了onpopstate事件来监听历史栈的改变,只要历史栈有信息发生改变的话,就会触发该事件。
history.pushState({},title,url); // 向历史记录中追加一条记录
history.replaceState({},title,url); // 替换当前页在历史记录中的信息。
window.addEventListener('popstate', function(event) {
console.log(event)
})
使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>history模式</title>
</head>
<body>
<ul>
<li>
<a href="/home" rel="external nofollow" >首页</a>
</li>
<li>
<a href="/about" rel="external nofollow" >关于</a>
</li>
</ul>
<div id="routerView"></div>
<script>
const component = {
home() {
return `<div>home页面</div>`
},
about() {
return '<div>关于页面</div>'
}
}
const routerRender = pathname => {
let html = ''
try {
html = component[pathname]()
} catch (error) {
html = `<div>404</div>`
}
document.getElementById('routerView').innerHTML = html
}
// history模式,它的路由导航,只能通过js来完成 , history它是js对象
// 给链接添加点击事件
document.querySelectorAll('a').forEach(node => {
node.addEventListener('click', function (evt) {
// 阻止a标签的默认跳转行为
evt.preventDefault()
// 跳转到指定的地址,能回退
// history.pushState
// 跳转到指定持址,不能回退
// history.replaceState
history.pushState({}, null, this.href)
// 渲染
routerRender(this.href.match(/\/(\w+)$/)[1])
})
})
// 在网页加载完毕后立刻执行的操作,即当 HTML 文档加载完毕后,立刻渲染 home 中的标签
window.onload = () => {
routerRender('home')
}
// 回退
window.addEventListener('popstate', function () {
routerRender(location.pathname.slice(1))
})
</script>
</body>
</html>
优缺点:
缺点:history模式,兼容性较差,刷新页面,页面会404,需要服务器端配置支持
优点:地址栏更优雅,方便记忆,有利于有seo
来源:https://blog.csdn.net/weixin_45605541/article/details/126902701


猜你喜欢
- 问题背景目前的linux发行版上,有很多安装了两个版本的python。我的机器上默认的版本为python 2.x。且在使用easy_inst
- 1、目的通过读取配置文件获取pgsql用户名和密码及数据库和数据表,从而读取所需字段值。2、代码架构config/config.go:读取配
- 简介:上文中已经介绍如何安装Pycharm已经环境变量的配置。现在软件已经安装成功,现在就开始动手做第一个Python项目。第一个“Hell
- 1、吝啬你的代码,用最少的代码做最合适的事情; 比如你的代码中用到了很多document.getElementById(),你是否考虑写一个
- 如下所示:matplotlib subplots 设置总图的标题 :fig.suptitle(dname,fontsize=16,x=0.5
- order by 查询语句使用也是非常频繁,有时候数据量大了会发现排序查询很慢,本文就介绍一下 MySQL 是如何进行排序的,以及如何利用其
- 前言本文的脚本是分析nginx的访问日志, 主要为了检查站点uri的访问次数的,检查的结果会提供给研发人员做参考,因为谈到分析嘛,那肯定要用
- 在使用python通过open()函数来打开文件的时候,传递绝对路径给open()的时候,发现路径参数的内容与想象中的有所出入:由于wind
- 代码案例import pluggy# HookspecMarker 和 HookimplMarker 实质上是一个装饰器带参数的装饰器类,作
- 作用: 构建一些简单的SQL语句,结合在提交表单时使用,可以较方便<%@LANGUAGE="VBSCRIPT&
- 查看数据库状态:service mysqld status 启动数据库:service mysqld start&
- 第一次打包vue的项目部署到服务器下时,发现初次加载特别的缓慢,将近20s页面才加载出来,完全没有开发环境上的那么流畅。主要原因是页面在打包
- 先说明2点开启缓存也会带来开销,主要表现在一下方面读取在查询开始之前必须要检查缓存如果查询是缓存的,但是不在结果集中,那么产生结果后保存数据
- 在按钮旁边加文字1.打开editor/js/ 两个js文件fckeditorcode_gecko.js fckeditorcode_ie.j
- 在许多场合,你将不得不编写必须处理时间的代码。你可以写一个时钟程序,或者在你的代码中测量两点之间的时间差。无论是哪种方式,知道如何在Go中处
- 1.TCP是一种面向连接的可靠地协议,在一方发送数据之前,必须在双方之间建立一个连接,建立的过程需要经过三次握手,通信完成后要拆除连接,需要
- 一个程序要进行交互,就需要进行输入,进行输入→处理→输出的过程。所以就需要用到输入和输出功能。同样的,在Python中,怎么实现输入和输出?
- 文件名全小写,可使用下划线包应该是简短的、小写的名字。如果下划线可以改善可读性可以加入。如mypackage。模块与包的规范同。如mymod
- 在本地使用pycharm连接databricks,大致步骤如下:首先,为了让本地环境能够识别远端的databricks集群环境,需要收集da
- 本文实例为大家分享了python tkinter实现学生信息管理系统的具体代码,供大家参考,具体内容如下初学python,代码写的比较繁杂,