哈哈,啰里吧嗦的干货的搬运工又来了,
开始之前,一波安利,建议先把这篇文章前端路由以及vue路由的hash模式与history模式看完。
最后这篇深入Vue-router的最佳实践。
hash方式:
1.1原理》hash方式利用的是window里的onhashChange事件
浏览器地址栏中#后面的东西不会被发送请求到服务端,自然不会刷新页面,同时地址栏中url也改变了,还会触发onhashChange事件。vue router就是通过监听onhashChange事件,然后再利用window.location这个接口,再去导航到其他的页面。当然这里的导航仅仅是前端的,实际上并不会向后端发送请求以及刷新页面。在vue-router的实现中,是利用了window.location.hash = path(path就你要去的地址啦,这个地方可以参考上面的深入Vue-Router的最佳实践里面其中对Vue-Router源码的解读)。
window.onhashchange = function (event) {
console.log("event.oldURL", event.oldURL);
console.log("event.newURL", event.newURL);
let hash = location.hash.slice(1);
document.body.style.color = hash;
};
hash方式除了看起来不美观,别的没啥大问题。
history方式:
2.1原理》history方式利用的是h5里的pushState接口
pushState的原理实现是当我们使用pushState接口去操作url的时候,也不会向服务器发送请求。但是这种方式有一个的缺点:当刷新页面的时候,会向服务器发送请求,如果后端没有相应的配置,就会报错。
具体参考传送门Manipulating the browser history。和pushState出现的还有一个叫popState接口,window.popstate传送门。另外需要注意的是:调用history.pushState()或者history.replaceState()不会触发popstate事件.popstate事件只会在浏览器某些行为下触发,比如点击后退、前进按钮(或者在JavaScript中调用history.back()、history.forward()、history.go()方法)。
实例一:对state的学习,如下图,打开之后,history中state是null:
实例二:pushState的学习
使用pushState的时候,报错:
history.pushState({ color: "red" }, "red", "/red");
1.1:直接右键使用浏览器打开html文件
在edge浏览器中,无论哪种方式都可以。
1.2:后面看有答案建议改为:
history.pushState(
null,//{ color: "red" },
null,//"red",
window.location.pathname + "/red"
);
无论使用文件协议还是http协议,在谷歌浏览器和火狐中都报错。在Edge浏览器中,文件协议可以成功。
总结:使用http协议打开就ok了。
两种方式区别
参考这篇文章vue-router的两种模式的区别。 其实区别在MDN里写的很清楚:传送门MDN_HISTORY
pushState() 设置的新 URL 可以是与当前 URL 同源的任意 URL;而 hash 只可修改 # 后面的部分,因此只能设置与当前 URL 同文档的 URL;
pushState() 设置的新 URL 可以与当前 URL 一模一样,这样也会把记录添加到栈中;而 hash 设置的新值必须与原来不一样才会触发动作将记录添加到栈中;
pushState() 通过 stateObject 参数可以添加任意类型的数据到记录中;而 hash 只可添加短字符串;
pushState() 可额外设置 title 属性供后续使用。
碎碎念:很多知识都只是会用,深入了解到它的内部原理之后,才明白,哦,原来是酱紫的啊。自己的理解和表达还欠缺,因为知道的不多,思维很狭隘,片面。活到老,学到老,不仅仅指的是专业知识和技能,所有的事情都是这样的。fighting啦,努力,坚持,希望,等待。