浅谈前端路由

栏目: JavaScript · 发布时间: 5年前

内容简介:路由的概念起源于网络工程,例如我们日常中的路由器,所谓前端路由的概念简单归纳就是前端可以自己根据不同url地址来展示不同的内容在前端路由的出现很好的解决了这个问题,前端路由不需要刷新整个页面,也就不会出现每一次切换都会出现闪烁,也没有网络延迟,大大提升了用户体验,减轻了服务器的压力,但是同时也存在问题是前端的安全性问题

路由的概念起源于网络工程,例如我们日常中的路由器,所谓前端路由的概念简单归纳就是前端可以自己根据不同url地址来展示不同的内容

Ajax 出现之前,都是使用后端路由来控制页面的渲染,服务器在接收到不同的 url 地址后,服务器通过解析 url 去拼接不同的 html ,然后返回给前端进行渲染,所以这也是后端路由的一个弊端,每一次的切换都是需要刷新整个页面,同时如果是大量的页面每一个页面都需要做一段逻辑处理也造成了后端实在不堪重负

前端路由的出现很好的解决了这个问题,前端路由不需要刷新整个页面,也就不会出现每一次切换都会出现闪烁,也没有网络延迟,大大提升了用户体验,减轻了服务器的压力,但是同时也存在问题是前端的安全性问题

目前前端路由的实现主要采用两个方法

  • hash
  • history

hash

hash就是我们通常说的锚点,一般用于内容的快速定位,但是hash值有一个特点,就是会改变url,但是不会触发浏览器的刷新,利用这个特点,我们配合可以检测到hash值变化的 hashchange 事件就能比较容易实现前端路由

window.addEventListener("hashchange",function () {
    console.log("锚点值改变了");
      //发送ajax请求,局部刷新页面,加载模块等操作
})

history

history是 window 对象的一部分,包含用户在浏览器中访问过的历史记录

  • 属性

    length:该属性会返回浏览器中历史记录的数量

    state:返回一个历史记录中顶部记录的状态值

    scrollRestoration:允许浏览器自定义设置默认的滚动行为,该属性有两个值,auto和manual

    这里关于 scrollRestoration 属性我们多说一点,在JavaScript中有一个叫做 scrollTo 的方法,该方法可以指定滑动位置,例如可以用来控制我们每一次聊天内容都固定在窗口的底部

    test.scrollTo(0,test.scrollHeight)

    但是有时候并不会生效,这个有可能就是 scrollRestoration 的原因,因为浏览器是默认保持滚动位置的,也就是说浏览器设置 history 的默认值是 auto ,我们需要将其设置为 manual

    history.scrollRestoration="manual"

    这个是时候就可以正常的按照我们的需求每一次固定到窗口底部了

    如果有兼容性问题采用如下写法

    setTimeout(() => {
        window.scrollTo(0, document.body.scrollHeight)
    })
  • 方法

    back:返回上一条历史记录

    forward:前往下一条历史记录

    go:前往指定的历史记录,history.go(1)相当于history.forward(),history.go(-1)相当于history.back()

同时在js中也存在一个 popstate 的方法可以监测到浏览器的前进/后退,同时在该方法中可以获取到历史记录的状态对象

window.addEventListener("popstate",function (e) {
    console.log(e.state)
})

在HTML5中新增加了两个方法 pushState,replaceState

这两个方法都是在不触发浏览器的刷新机制下改变浏览器的 url ,不同之处在于 pushState 相当于在浏览器历史记录栈中添加了一条我们自定义的历史记录,而 replaceState 相当于用我们自己设置的历史记录替换掉了浏览器当前的历史记录栈中的第一条,所以 pushState 会改变 historylength 长度,而 replaceState 则不会

这两个方法都接收三个参数

  1. state,一个指定网址相关的状态对象
  2. title,指定新页面的标题,但是目前被大部分浏览器忽略
  3. url,指定新的网址,但是必须是和当前网址是同源的

这两个方法都是不能被popstate监测到的,但是在执行两个方法的时候是能够触发history.state的从而我们可以拿到我们每一次增加/替换历史记录时的 state ,可以通过观察者模式来实现对 history 状态的监听

let page=1
ahead.addEventListener("click",function () {
    page++;
    window.history.pushState({page : page}, 'test', '#test');
    console.log(window.history.state);
      //通过state值可以加载不同模块/发送数据请求,局部刷新页面
})
window.addEventListener("popstate",function (e) {
    console.log(e.state)
      //在用户点击后退、前进时会被postate监测到,同时也会获取到state  
})


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

智能

智能

[法]弗雷德里克·马特尔 / 君瑞图、左玉冰 / 商务印书馆 / 2015-8 / 59.90

揭示数字化主流大趋势的最新权威论著 《主流》作者的最新力作!与法国秋季新版同步上市! 面对数字化时代的到来,美国、欧盟、中国、俄罗斯、印度、巴西、古巴、伊朗、南非、韩国、新加坡、肯尼亚、墨西哥、日本等世界各国各地区正在如何应对? 在国际地缘政治格局下如何把握数字化主流的大趋势? 谷歌、苹果、脸书、亚马逊、阿里巴巴、腾讯、中兴、华为等大家熟知的网络巨头接受了作者的采访。作者的......一起来看看 《智能》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试