vue-router两种模式的区别

本文探讨了前后端分离的概念及其实现方式,详细讲解了单页应用如何通过Ajax实现无刷新交互,以及前后端分离结合前端路由的重要性。深入剖析了hash模式和history模式在前端路由中的应用,包括hashchange事件的监听、history API的使用,以及它们在页面状态管理和URL映射中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前后端分离 ===> 利用Ajax,可以在不刷新浏览器的情况下异步数据请求交互。

单页应用(只有一个html文件,整个网站的所有内容都在这一个html里,通过js来处理)不仅仅是在页面交互是无刷新的,连页面跳转都是无刷新的。为了实现单页应用 ==> 前后端分离 + 前端路由。(更新视图但不重新请求页面)

前端路由实现起来其实也很简单,就是匹配不同的 url 路径,进行解析,加载不同的组件,然后动态的渲染出区域 html 内容。

hash模式

#后面 hash 值的变化,并不会导致浏览器向服务器发出请求,浏览器不发出请求,也就不会刷新页面。每次 hash 值的变化,会触发hashchange 这个事件,通过这个事件我们就可以知道 hash 值发生了哪些变化。然后我们便可以监听hashchange来实现更新页面部分内容的操作:

hash模式背后的原理是onhashchange事件,可以在window对象上监听这个事件:

window.onhashchange = function(event){
    console.log(event.oldURL, event.newURL);
    let hash = location.hash.slice(1);
    document.body.style.color = hash;
 
}

上面的代码可以通过改变hash来改变页面字体颜色。
在这里插入图片描述

switch (mode) {
  case 'history':
    this.history = new HTML5History(this, options.base)
    break
  case 'hash':
    this.history = new HashHistory(this, options.base, this.fallback)
    break
  case 'abstract':
    this.history = new AbstractHistory(this, options.base)
    break
  default:
    if (process.env.NODE_ENV !== 'production') {
      assert(false, `invalid mode: ${mode}`)
    }
}

HashHistory有两个方法:HashHistory.push()将新路由添加到浏览器访问历史的栈顶 和 HashHistory.replace()替换掉当前栈顶的路由
在这里插入图片描述
在这里插入图片描述
因为hash发生变化的url都会被浏览器记录(历史访问栈)下来,从而你会发现浏览器的前进后退都可以用了。这样一来,尽管浏览器没有请求服务器,但是页面状态和url一一关联起来。

history模式

因为HTML5标准发布,多了两个 API,pushState() 和 replaceState()。通过这两个 API (1)可以改变 url 地址且不会发送请求,(2)不仅可以读取历史记录栈,还可以对浏览器历史记录栈进行修改。

除此之外,还有popState().当浏览器跳转到新的状态时,将触发popState事件。

修改历史状态
包括了pushState,replaceState两个方法,这两个方法接收三个参数:stateObj,title,url

window.history.pushState(stateObject, title, URL)
window.history.replaceState(stateObject, title, URL)

切换历史状态
包括back,forward,go三个方法,对应浏览器的前进forward,后退back,跳转go操作。 有同学说了,(谷歌)浏览器只有前进和后退,没有跳转,嗯,在前进后退上长按鼠标,会出来所有当前窗口的历史记录,从而可以跳转(也许叫跳更合适):

  • history.go(-2);//后退两次
  • history.go(2);//前进两次
  • history.back(); //后退
  • hsitory.forward(); //前进

区别:

  • 前面的hashchange,你只能改变#后面的url片段。而pushState设置的新URL可以是与当前URL同源的任意URL。
  • history模式则会将URL修改得就和正常请求后端的URL一样,如后端没有配置对应/user/id的路由处理,则会返回404错误

当用户刷新页面之类的操作时,浏览器会给服务器发送请求,所以这个实现需要服务器的支持,需要把所有路由都重定向到根页面。

history模式怕啥
不怕前进,不怕后退,就怕刷新,(如果后端没有准备的话),因为刷新是实实在在地去请求服务器的。

在history模式下,你可以自由的修改path。history模式最终的路由都体现在url的pathname中,这部分是会传到服务器端的,因此需要服务端对每一个可能的path值都作相应的映射。

当刷新时,如果服务器中没有相应的响应或者资源,会分分钟刷出一个404来。

router挂在到根组件

new Vue({
  router
})

此时的router会被挂载到 Vue 的根组件this.$options选项中。在 option 上面存在 router 则代表是根组件。

$router 和 $route的区别

  1. $route从当前router跳转对象里面可以获取的name、path、query、params等,( < router-link >
    传的参数由 this. $route.query或者 this. $route.params 接收)
  2. $router为VueRouter实例。想要导航到不同URL,则使用 $router.push方法;返回上一个history也是使用
    $router.go方法
### Vue Router两种路由模式 #### 1. Hash 模式 Hash 模式的 URL 特征是以 `#` 开头,例如:`http://example.com/#/about`。这种模式利用了浏览器地址栏中的哈希部分(即 `#` 后面的内容),而不会触发页面刷新。当用户访问带有哈希的 URL 时,浏览器会将哈希后的路径视为锚点,并将其存储在历史记录中[^1]。 ##### 实现方式 在 Vue Router 中启用 Hash 模式非常简单,只需创建实例时不指定任何特殊配置即可,因为这是默认模式。以下是示例代码: ```javascript import { createRouter, createWebHashHistory } from 'vue-router'; const routes = [ { path: '/home', component: Home }, { path: '/about', component: About } ]; const router = createRouter({ history: createWebHashHistory(), routes, }); ``` 这种方式通过监听哈希的变化来更新视图,无需服务端支持,因此适合大多数场景下的开发环境测试[^2]。 #### 2. History 模式 相比之下,History 模式的 URL 更加简洁美观,因为它不包含 `#` 符号,例如:`http://example.com/about`。该模式依赖于 HTML5 提供的 History API (`pushState`, `replaceState`) 来完成 URL 跳转而不重新加载整个页面[^3]。 然而,在使用 History 模式时需要注意服务器配置问题。由于每次跳转会请求实际存在的资源文件,如果服务器未正确设置,则可能导致 404 错误发生。所以通常需要对后端进行额外调整以便能够捕获所有未知路径并返回前端入口文件(index.html)。 ##### 实现方式 为了开启 History 模式,需显式调用 `createWebHistory()` 方法替代默认的 `createWebHashHistory()`. 下面是一个简单的例子展示如何定义基于 History 模式的路由器: ```javascript import { createRouter, createWebHistory } from 'vue-router'; // 定义一些路由组件... const routes = [{path:'/foo',component:Foocomponent},{path:'/bar',component:Barchart}] export default new createRouter({ mode:'history', history:createWebHistory(), routes // (缩写) 相同于 routes: routes }) ``` 上述脚本片段展示了如何切换到更现代且用户体验更好的URL结构的同时保持单页应用程序的功能特性. --- ### 总结对比表 | **属性** | **Hash Mode** | **History Mode** | |------------------|---------------------------------------|----------------------------------------| | **URL 形式** | 包含 `#` | 不含 `#` | | **兼容性** | 所有主流浏览器 | 需要HTML5支持 | | **SEO 友好度** | 较低 | 较高 | | **服务器需求** | 无 | 需要特定配置 | ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值