赞
踩
在 Web 前端单页应用 SPA(Single Page Application)中,路由描述的是 URL 与 UI 之间的映射关
系,这种映射是单向的,即 URL 变化引起 UI 更新(无需刷新页面)。
vue-router 是 Vue.js 官方的路由插件,它和 vue.js 是深度集成的,适合用于构建单页面应用。
那与传统的页面跳转有什么区别呢?
在 vue-router 单页面应用中,则是路径之间的切换,也就是组件的切换。路由模块的本质就是建立起 url 和页面之间的映射关系。
Vue Router 包含的功能有:
在 vue-router 中,可以通过三种方式来实现前端路由的变化,分别为 hash、history 和 abstract。
hash 是 URL 中 hash (#) 及后面的那部分,常用作锚点在页面内进行导航,最重要的是改变 URL 中的 hash 部分不会引起页面刷新。
我们可以通过 hashchange 事件监听 URL 的变化,改变 URL 的方式只有这几种:
window.location
改变 URL我们通过下面的例子,来看下 hash 实现路由的原理:
<!DOCTYPE html> <html lang="en"> <body> <ul> <ul> <!-- 定义路由 --> <li><a href="#/home">home</a></li> <li><a href="#/about">about</a></li> <!-- 渲染路由对应的 UI --> <div id="routeView"></div> </ul> </ul> </body> <script> let routerView = document.getElementById('routeView'); window.addEventListener('hashchange', () => { routerView.innerHTML = location.hash; }); window.addEventListener('DOMContentLoaded', () => { if (!location.hash) { //如果不存在hash值,那么重定向到#/ location.hash = '/'; } else { //如果存在hash值,那就渲染对应UI routerView.innerHTML = location.hash; } }); </script> </html>
上面的代码很简单,只要注意一下几点:
由于 html5 标准的发布,history 的 api 增加了两个 API。pushState 和 replaceState。通过这两个 API 可以改变 url 地址且不会发送请求。同时还有 popstate 事件。通过这些就能用另一种方式来实现前端路由了,但原理都是跟 hash 实现相同的。
用了 HTML5 的实现,单页路由的 url 就不会多出一个#,变得更加美观。但因为没有 # 号,所以当用户刷新页面之类的操作时,浏览器还是会给服务器发送请求。为了避免出现这种情况,所以这个实现需要服务器的支持,需要把所有路由都重定向到根页面。
我们主要说几个注意点:
标签改变 URL 不会触发页面刷新,也不会触发 popstate 方法。所以我们可以拦截 pushState/replaceState 的调用和
标签的点击事件来检测 URL 变化,从而触发 router-view 的视图更新。所以,我们其实是需要监听 popstate 以及拦截 pushState/placeState 以及 a 的点击去实现监听 URL 的变化。
我们通过下面的例子,来看下 history 实现路由的原理:
<!DOCTYPE html> <html lang="en"> <body> <ul> <ul> <li><a href="/home">home</a></li> <li><a href="/about">about</a></li> <div id="routeView"></div> </ul> </ul> </body> <script> let routerView = document.getElementById('routeView'); window.addEventListener('DOMContentLoaded', () => { routerView.innerHTML = location.pathname; var linkList = document.querySelectorAll('a[href]'); linkList.forEach(el => el.addEventListener('click', function(e) { e.preventDefault(); history.pushState(null, '', el.getAttribute('href')); routerView.innerHTML = location.pathname; }), ); }); window.addEventListener('popstate', () => { routerView.innerHTML = location.pathname; }); </script> </html>
注意一下几个重点:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。