zoukankan      html  css  js  c++  java
  • 前端路由跳转基本原理

    什么是前端路由?

    前端路由,就是一个前端不同页面的状态管理器,可以不向后台发送请求而直接通过前端技术实现多个页面的效果。
    

    单页路由跳转模式有两种:

    • 哈希模式(利用hashchange 事件监听 url的hash 的改变)
    • history模式(使用此模式需要后台配合把接口都打到我们打包后的index.html上)

    1.哈希模式的原理:hashChange

    window.addEventListener('hashchange', function(e) {
      console.log(e)
    })

    window.addEventListener('hashchange')

    hash原理:

    HTML页面中通过锚点定位原理可进行无刷新跳转,触发后url地址中会多出 # + 'XXX'的部分,同时在全局的window对象上触发hashChange事件,这样在页面锚点哈希改变为某个预设值的时候,
    通过代码触发对应页面DOM改变,就可以实现基本的路由了。

    由于 hash 值变化不会导致浏览器向服务器发出请求,而且 hash 改变会触发 hashchange 事件,浏览器的进后退也能对其进行控制,所以人们在 html5 的 history 出现前,基本都是使用 hash 来实现前端路由的。

    2.history模式:

    history 利用了HTML5 History Interface中新增的pushState()和replaceState()方法,用来完成URL跳转而无需重新加载页面,不过这种模式需要后台配置支持。
    因为我是的英语是单页面客户端应用,如果没有后台正确的配置,就需要配置404页面。

    history常用API:前进后退

    • history.forward(); //在历史记录中前进一步
    • history.back(); //在历史记录中后退一步
    • history.go(n): //在历史记录中跳转n步骤,n=0为刷新本页,n=-1为后退一页。

    history修改历史状态:

    pushState    replaceState:

    两个方法,这两个方法接收三个参数: stateObjtitleurl

    • history.pushState(data[,title][,url]);//向历史记录中追加一条记录
    • history.replaceState(data[,title][,url]);//替换当前页在历史记录中的信息。
    • history.state;//是一个属性,可以得到当前页的state信息。
    • window.onpopstate;//是一个事件,在点击浏览器后退按钮或js调用forward()、back()、go()时触发。监听函数中可传入一个event对象,event.state即为通过pushState()或replaceState()方法传入的data参数。

      通过pushstate把页面的状态保存在state对象中,当页面的url再变回这个url时,可以通过event.state取到这个state对象,从而可以对页面状态进行还原,

    history存在的问题:

    通过history api,我们丢掉了丑陋的#,但是它也有个问题:不怕前进,不怕后退,就怕刷新,f5,(如果后端没有准备的话),因为刷新是实实在在地去请求服务器的,不玩虚的。
    在hash模式下,前端路由修改的是#中的信息,而浏览器请求时是不带它玩的,所以没有问题.
    但是在history下,你可以自由的修改path,当刷新时,如果服务器中没有相应的响应或者资源,会分分钟刷出一个404来。
    

      

    参考:https://www.jianshu.com/p/bfffb4b8c9fa

    参考:https://www.cnblogs.com/dashnowords/p/9671213.html

    参考:https://www.cnblogs.com/GGbondLearn/p/12239651.html

  • 相关阅读:
    [LeetCode] 16. 3Sum Closest 解题思路
    [LeetCode] 28. Implement strStr() 解题思路
    我所理解的 KMP(Knuth–Morris–Pratt) 算法
    [LeetCode] 86. Partition List 解题思路
    [LeetCode] 61. Rotate List 解题思路
    [LeetCode] 11. Container With Most Water My Submissions Question 解题思路
    如何强制卸载阿里云盾(安骑士)监控及屏蔽云盾IP检测&附带教程
    让Nginx支持pathinfo
    linux下解压rar文件
    Linux查看物理CPU个数、核数、逻辑CPU个数
  • 原文地址:https://www.cnblogs.com/liumcb/p/14047902.html
Copyright © 2011-2022 走看看