Vue Router的两种模式区别以及使用注意事项

Chason
2021-03-18 / 0 评论 / 0 点赞 / 915 阅读 / 2,029 字
温馨提示:
本文最后更新于 2021-03-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

原文:http://www.javanx.cn/20200410/vue-router-mode/

Vue Router 是Vue官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。vue-router默认hash模式,还有一种是history模式。

const router = new VueRouter({
  mode: 'history', // 这里可以配置是那种模式
  routes: [...]
})

hash模式

hash 模式的工作原理是 hashchange 事件,可以在window监听 hash 的变化。我们在url后面随便添加一个#xxxx就可以触发这个事件。

比如:

window.onhashchange = function(event){
  console.log(event);
  // {
  //   ...
  //   oldUrl: 'http://xxxx#web',
  //   newUrl: 'http://xxxx#webxiu',
  // }
}

打印对象里面包含两个字段,oldUrlnewUrl,这样我们就能根据对应的hash值,做出相应操作。

尽管改变hash,浏览器本身是没有任何请求服务器动作的,但是页面状态和url已经关联起来了,这就是所谓的前端路由,单页应用的标配。

history模式

HTML5新增的API

1、history.pushState(data, title [, url]):向历史记录堆栈顶部添加一条记录; data会在onpopstate事件触发时作为参数传递过去;title为页面标题,当前所有浏览器都会 忽略此参数;url为页面地址,可选,缺省为当前页地址;

2、history.replaceState(data, title [, url]) :更改当前的历史记录,参数同上;

3、history.state:用于存储以上方法的data数据,不同浏览器的读写权限不一样;

4、window.onpopstate:响应pushState或replaceState的调用;有了这几个新的API,针对支持的浏览器,我们可以构建用户体验更好的应用了。就像刚提到的Facebook相册,虽然是AJAX的方式,但用户可以直接复 制页面地址分享给好友,

如果不想要很丑的 hash,我们可以用路由的 history 模式,这种模式充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。

当你使用 history 模式时,URL 就像正常的 url,例如 http://xxx/webxiu

不过使用 history 模式时也需要注意,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问 http://xxx/webxiu 就会返回 404,这就是非常不好的。

所以呢,我们需要在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。

比如:

nginx(添加到vhosts.conf)

location / {
  try_files $uri $uri/ /index.html;
}

Apache

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>

如果我们的服务器完成了上面的配置,这时服务器就不会返回404错误页面了,因为对于所有路径都会返回 index.html 文件。为了避免这种情况,你应该在 Vue 应用里面覆盖所有的路由情况,然后在给出一个 404 页面。

const router = new VueRouter({
  mode: 'history',
  routes: [
    { path: '*', component: NotFoundComponent }
  ]
})
0

评论区