vue-router路由对象中,路由有两种模式: hash 和 history
    hash
    hash 背后的原理是 onhashchange
    onhashchange 事件在当前 URL 的锚部分(以 ‘#’ 号为开始) 发生改变时触发
    localtion是js里管理地址栏的内置对象,可通过window.localtion访问
    hash发生变化的url都会被浏览器记录下来,使得浏览器的前进后退都可以使用了
    window.onhashchange=function(){
    let hash=location.hash.slice(1);
    document.body.style.color=hash;
    }
    history
    history模式利用了HTML5 History Interface中新增的pushState()和replaceState()方法
    通过pushstate把页面的状态保存在state对象中,当页面的url再变回这个url时,可以通过event.state取到这个state对象,从而可以对页面状态进行还原
    popstate 实现history路由拦截,监听页面返回事件
    当活动历史记录条目更改时,将触发popstate事件
    这两个方法应用于浏览器的历史记录栈,提供了对历史记录进行修改的功能。只是当他们进行修改时,虽然修改了url,但浏览器不会立即向后端发送请求。
    当刷新时,如果服务器中没有相应的相应或者资源,访问时会返回404,所以history模式需要后台配置支持
    // pushState、replaceState两个方法,这两个方法接收三个参数:stateObj,title,url
    history.pushState({color:’red’}, ‘red’, ‘red’)
    window.onpopstate = function(event){
    console.log(event.state)
    if(event.state && event.state.color === ‘red’){
    document.body.style.color = ‘red’;
    }
    }
    history.back();
    history.forward();

    两者区别

    hash只能改变#后面的url片段,而history 可以设置与当前url**同源的任意url
    hash必须设置与当前url不同的url的,才会触发动作将记录添加到栈中,history设置的新url可与当前url一致,这样也会把记录添加到栈中
    hash模式下,仅hash符号之前的url会被包含在请求中,后端即使没有做到对路由的全覆盖,也不会返回404错误;而history 模式下前端的url必须和实际向后端发起请求的url一致
    参考资源
    https://www.jianshu.com/p/81ccd1124f48