有两种方式实现单页应用,Hash 和 H5 的 history
通过 Hash 实现前端路由
虽然 hash 的兼容性较好,但搜索引擎对带有 hash 的页面不友好,带有 hash 的页面内难以追踪用户行为
改变 url 的 hash 值是不会刷新页面的。可以通过<a href="#edit">edit</a>
实现,也可以通过 JavaScript 实现:
1 | window.location.hash='edit' |
通过 hashchange 的事件,可以监听 hash 的变化:
1 | window.onhashchange = function(event) { |
通过 H5 的 history 实现前端路由
History 路由是基于 HTML5 规范,在 HTML5 规范中提供了 history.pushState || history.replaceState 来进行路由控制。
属性:
History.length: 返回在会话历史中有多少条记录,包含了当前会话页面。
History.state: 保存了会触发 popState 事件的方法所传递过来的属性对象
方法:
History.back(): 在 history 中向后跳转,和用户点击浏览器回退按钮的效果相同
History.forward(): 向前跳转,和用户点击浏览器前进按钮的效果相同
History.go(number): 可以跳转到浏览器会话历史中的指定的某一个记录页
History.pushState(state, title, url): 新建一个历史记录项,pushState() 绝对不会触发 hashchange 事件,即使新的 URL 与旧的 URL 仅哈希不同也是如此。
state:存储 JSON 字符串,可以用在 popstate 事件中
title:现在大多浏览器忽略这个参数,直接用 null 代替
url:任意有效的 URL,用于更新浏览器的地址栏
History.replaceState(state, title, url): 修改了当前的历史记录项
1 | history.pushState({}, null, '/about') |
React-router 用法
react-router-dom 是 react-router 的升级版,用于 web 端,react-route 是路由的核心。具体用法和 vue-router 类似,毕竟原理都差不多。react-router V2 的版本和最新版本变化还是有点多,这篇文章写的很详细:https://zhuanlan.zhihu.com/p/31874420 最近碰到比较多的就是,动态传值,路由嵌套的用法,看着项目里的写法,模仿着用也不难。