如何去掉vue的url地址中的#号?及其原理?

点击打开视频讲解更加详细

如何去掉vue的url地址中的#号?

  1. import Vue from 'vue';
  2. import VueRouter from 'vue-router';
  3. Vue.use(VueRouter)
  4. // 1. 定义一些路由
  5. // 每个路由都需要映射到一个组件。
  6. const routes = [
  7. { path: '/home', component: ()=> import('../views//home.vue') },
  8. { path: '/about', component: ()=> import('../views/about.vue') },
  9. ]
  10. const router = new VueRouter({
  11. mode: 'hash', //默认是hash模式,url是带#号的
  12. // mode: 'history', //history模式url不带#号
  13. routes
  14. })
  15. export default router

hash模式实现原理

hash模式主要是根据url的hash值来跳转不同的路由页面。

采用hash模式的路由模式中,url后面有一个#,#后面包括#就是此路由的hash值,hash模式背后的原理是onhashchange事件,可以在window对象上监听这个事件

vue中hash模式的原理就是通过监听hash值的变化来匹配不同的组件,进而来重新渲染视图。

优点

  • 兼容性强,兼容性达到了IE8
  • 除发送ajax和资源请求外不会发送其他多余请求
  • 改变#后的路径、不会自动刷新页面
  • 无需服务端进行配合

缺点

  • 访问路径上包含#,不美观
  • 对于需要锚点功能的需求会与当前路由机制发生冲突
  • 重定向操作时,后段无法获取url完整路径。

监听onhashchange事件案例:

src\views\home.vue

  1. <template>
  2. <div>
  3. home
  4. <button @click="handerHref">跳转</button>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'home',
  10. data(){
  11. return {
  12. }
  13. },
  14. created(){
  15. },
  16. mounted() {
  17. window.addEventListener('hashchange',this.onhashchange)
  18. },
  19. computed:{
  20. },
  21. methods:{
  22. handerHref(){
  23. window.location.href = "http://localhost:8080/#/about"
  24. },
  25. onhashchange(e){
  26. console.log(e.oldURL,'home');
  27. console.log(e.newURL);
  28. console.log(location.hash);
  29. }
  30. }
  31. }
  32. </script>
  33. <style scoped>
  34. </style>

src\views\about.vue

  1. <template>
  2. <div>
  3. about
  4. </div>
  5. </template>
  6. <script>
  7. export default {
  8. name: 'about',
  9. data(){
  10. return {
  11. }
  12. },
  13. created(){
  14. },
  15. mounted() {
  16. window.addEventListener('hashchange',this.onhashchange)
  17. },
  18. computed:{
  19. },
  20. methods:{
  21. onhashchange(e){
  22. console.log(e.oldURL,'about');
  23. console.log(e.newURL);
  24. console.log(location.hash);
  25. }
  26. }
  27. }
  28. </script>
  29. <style scoped>
  30. </style>

history模式实现原理

优点

  • 符合url地址规范, 不需要#, 使用起来比较美观
  • 可以使用history.state获取完整的路由信息
  • 后端可以获取到完整的路由信息

缺点

  • 兼容性只到IE10
  • 改变url路径后、会重新请求资源。
  • 若访问的路由地址不存在时、会报404,需服务端配合支持重定向返回统一的404页面。

history路由中我们使用onpopstate事件函数来监听history路由的变化,但是popstate事件函数只能监听到history.go、forward、back的切换路由方式,但是它不能够监听到pushState添加历史记录(就是在页面中点击某个a标签进行跳转的方式,点击页面顺序:a->b->c,记录的历史记录中a、b、c都存在,而replaceState则不同)、replaceState(点击页面顺序:a->b->c,记录的历史记录中只有a->c,即用c代替了b记录,b记录被删除了)切换路由的方式。

监听popstate、pushState、replaceState事件案例:

src\views\home.vue

  1. <template>
  2. <div>
  3. home
  4. <button @click="handerHref">跳转</button>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'home',
  10. data(){
  11. return {
  12. }
  13. },
  14. created(){
  15. },
  16. mounted() {
  17. window.addEventListener('hashchange',this.onhashchange)
  18. },
  19. computed:{
  20. },
  21. methods:{
  22. handerHref(){
  23. window.location.href = "http://localhost:8080/#/about"
  24. },
  25. onhashchange(e){
  26. console.log(e.oldURL,'home');
  27. console.log(e.newURL);
  28. console.log(location.hash);
  29. }
  30. }
  31. }
  32. </script>
  33. <style scoped>
  34. </style>

src\views\about.vue

  1. <template>
  2. <div>
  3. about
  4. <button @click="handerBack">返回</button>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'about',
  10. data(){
  11. return {
  12. }
  13. },
  14. created(){
  15. },
  16. mounted() {
  17. window.addEventListener('hashchange',this.onhashchange) //hash模式跳转页面触发onhashchange事件
  18. window.addEventListener("popstate", this.onpopstate) //popstate事件函数只能监听到history.go、forward、back的切换路由方式,但是它不能够监听到pushState添加历史记录
  19. // 但是它不能够监听到pushState添加历史记录(就是在页面中点击某个a标签进行跳转的方式,点击页面顺序:a->b->c,记录的历史记录中a、b、c都存在,而replaceState则不同)、replaceState(点击页面顺序:a->b->c,记录的历史记录中只有a->c,即用c代替了b记录,b记录被删除了)切换路由的方式
  20. // 对于pushState、replaceState需要通过函数重写的方式进行劫持,也就是说我们重写pushState和replaceState
  21. // 但是我们一般都是pushState来跳转链接,是通过this.$router.replace()来触发;而pushState()是通过this.$router.push()来触发
  22. // 重写pushState方法
  23. const rawPushState = window.history.pushState
  24. window.history.pushState = function (...args) {
  25. rawPushState.apply(window.history, args)
  26. console.log("终于监视到pushState了");
  27. }
  28. // 重写replaceState方法
  29. const rawReplaceState = window.history.replaceState
  30. window.history.replaceState = function (...args) {
  31. rawReplaceState.apply(window.history, args)
  32. console.log("终于监视到replaceState了");
  33. }
  34. },
  35. computed:{
  36. },
  37. methods:{
  38. handerBack(){
  39. // window.location.reload() //刷新
  40. // window.history.go(1) //前进
  41. // window.history.go(-1) //后退
  42. // window.history.forward() //前进
  43. // window.history.back() //后退+刷新
  44. this.$router.replace('/home')
  45. },
  46. onhashchange(e){
  47. console.log(e.oldURL,'about');
  48. console.log(e.newURL);
  49. console.log(location.hash);
  50. },
  51. onpopstate(e){
  52. console.log(e,'popstate')
  53. }
  54. }
  55. }
  56. </script>
  57. <style scoped>
  58. </style>

hash和history的区别

hash模式的url后跟hash值#…,它的原理就是使用window.onHashChange来监听hash值的改变,一旦发生变化就找出此hash值所匹配的组件,进而将组件渲染到页面中。但是hash模式这种带hash值的url是非常丑的,项目中也很少用hash模式。

history模式中的url是以/user这种格式,比较常见,它的原理是通过window.onpopstate来监听路由变化,进而匹配不同的组件来渲染出来。

若对您有帮助,请点击跳转到B站一键三连哦!感谢支持!!!

【面试题】如何去掉vue的url地址中的#号?及其原理?的更多相关文章

  1. URL地址中使用中文作为的参数【转】

    原文:http://blog.csdn.net/blueheart20/article/details/43766713 引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作 ...

  2. 去除magento多店铺URL地址中的“___from_store=”

    magento 的多店铺功能,大多数情况下是根据语言来进行选择的,当添加了多店铺之后,一般情况下我们会选择开启添加store code到url地址中. Magento 自带的这种功能算是比较不错了,但 ...

  3. 解决URL地址中的中文乱码问题的办法

    解决URL地址中的中文乱码问题的办法 引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作为的参数的情况,这种情况下,一般都需要正确的设置和编码中文字符信息.乱码问题就此产生 ...

  4. URL地址中中文乱码详解(javascript中encodeURI和decodeURI方法、java.net.URLDecoder.encode、java.net.URLDecoder.decode)

    引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作为的参数的情况,这种情况下,一般都需要正确的设置和编码中文字符信息.乱码问题就此产生了,该如何解决呢?且听本文详细道来. ...

  5. JS动态获取项目名以及获取URL地址中的参数

    在项目当中我们可能会遇到例如改变的项目名称之后,相对应的地址就需要改变,为了减少工作量,将地址当中的项目名这一块写成动态获取的,那么最关键一点就是我要先获取它,再进行操作: 知识点整理,话不多说,直接 ...

  6. URL 链接中 井号#、问号?、连接符& 分别有什么作用?

    在一个 URL 中可以包含很多的内容,其中不仅仅是包含 26 个英文字母,10 个罗马数字,中文汉字,还可以拥有井号“#”.问号“?”.连接符“&”等三种最常见的符号,那么这些符号在网站中都有 ...

  7. JavaScript------获取url地址中的参数

    $(document).ready(function () { //获取地址中的参数(name是字符串) function getParameter(name) { //正则表达式 var reg = ...

  8. ipv6地址在URL中的表达方式,如何在URL地址中包含ipv6地址

    摘要 本文档定义了在WWW浏览器的URL中执行的文本IPv6地址的格式.在包括Microsoft的IE,Mozilla和Lynx等几个已经被广泛安装使用的浏览器的IPv6版本中,这种格式已经被使用.并 ...

  9. URL地址中的转义符

    如果在XML里面存储URL地址可能涉及到转义符的问题 WEB开发中通过问号(?)方式在浏览器地址栏中传值时.浏览器是通过“&”来区分问号后的参数个数的. 如果出现传值参数中带有“&”时 ...

随机推荐

  1. CSP 2021 总结

    CSP 2021 总结 PJ 开题顺序:1342 应该先做 T2 ,导致我 T2 直接看错 T1.T3 T1 :直接推规律即可,考场的想法应该正确 T3 :好家伙直接 map 走起 T2 最崩溃的来了 ...

  2. MySQL-5-TCL,视图,变量,存储过程和函数,流程控制

    TCL:Transaction Control Language事务控制语言 TCL 事务的特点 acid: 原子性(Atomicity),一致性(Consistency),隔离性(isolation ...

  3. 记一次beego通过go get命令后找不到bee.exe的坑

    学习goweb开发,gin是个轻量级的框架.如果想要一个类如aspnetmvc帮我们搭建好了的goweb框架,beego值得去学习.否则gin下面需要动手构建好多代码.新手还是先学现成的节约时间成本. ...

  4. 又拍云 Redis 的改进之路

    作为推出国内首创可编程 CDN 服务的专业云服务提供商,又拍云利用 CDN 边缘网络规模和性能,允许客户自定义编写规则来满足常用业务场景.而为了保证这些源数据,如边缘重定向.请求限速.自定义错误页面. ...

  5. Python程序入口 __name__ == ‘__main__‘ 有重要功能(多线程)而非编程习惯

    文章来源于互联网(https://jq.qq.com/?_wv=1027&k=rX9CWKg4) 在Python中,被称为「程序的入口」的 if name =='main': 总是出现在各种示 ...

  6. HTTP Status 405 - Request method 'GET' not supported?(尚硅谷Restful案例练习关于Delete方法出现的错误)

    哈罗大家好,最近在如火如荼的学习java开发----Spring系列框架,当学习到SpringMVC,动手实践RESTFUL案例时,发现了以上报错405,get请求方法没有被支持. 首先第一步,我查看 ...

  7. 新版recon-ng安装模块

    表现:进入后报[*] No modules enabled/installed. 1.直接在recon-ng控制台输入marketplace install all,用来下载所有插件,如果不可以,往下 ...

  8. 外贸ERP系统哪些模块比较重要?得具备什么功能?

    我国的外贸企业众多,涉及到多个行业,受疫情的影响,部分企业面临着极大的发展难题.而想要更好的在市场当中生存,除了要有更敏锐的市场嗅觉,也要有更大胆的创新.在外贸ERP系统的发展之下,会得到更多企业的青 ...

  9. idea引入fastjson的jar包:ClassNotFound

    idea 手动添加fastjson的jar包时,既在项目依赖里添加了,又在WEB-INF下的lib库里添加了 但是启动后就是加载不到,报错:ClassNotFound 尝试了好久,也参考了网上的许多建 ...

  10. 分布式二级缓存组件实战(Redis+Caffeine实现)

    前言 在生产中已有实践,本组件仅做个人学习交流分享使用.github:https://github.com/axinSoochow/redis-caffeine-cache-starter 个人水平有 ...