首页 > 其他分享 >前端路由及两种实现方式

前端路由及两种实现方式

时间:2023-11-29 10:24:57浏览次数:30  
标签:两种 hash URL 前端 刷新 history 路由 页面

路由的概念来源于服务端,在服务端中路由描述的是 URL与处理函数之间的映射关系,当然也会处理不同的URL来展示不同
的视图界面。
随着Ajax的盛行,无刷新交互成为了当下的主流,我们更希望在无刷新的情况下完成不同URL来展示不同的视图界面,即在一
个页面中完成路由的切换(俗称:单页面应用开发SPA),这就是前端路由。
那么如何做到在一个页面中完成URL与UI的映射关系呢?一般我们有两种实现方案:

  1. hash模式
  2. history模式

hash模式

hash模式
hash是 URL中 hash (#) 及后面的那部分,常用作锚点在页面内进行导航,改变 URL中的 hash部分不会引起页面刷新。我们通
过 hashchange 事件来监听 hash值的改变,这样就可以显示不同的UI内容,示例代码如下:

<body>
    <ul>
    <!-- 定义路由 -->
        <li><a href="#/home">home</a></li>
        <li><a href="#/about">about</a></li>
        <!-- 渲染路由对应的 UI -->
        <div id="routerView"></div>
    </ul>
</body>
<script>
window.addEventListener('hashchange', onHashChange)
    onHashChange()
    function onHashChange () {
    switch (location.hash) {
        case '#/home':
        	routerView.innerHTML = 'Home'
        break;
        case '#/about':
        	routerView.innerHTML = 'About'
        break;
    }
}
</script>

history模式

history对象提供了pushState方法和popstate事件,pushState方法可以让URL发生改变但并不会引起页面的刷新,而popstate事件则
用来监听URL改变的值,这样就可以显示不同的UI内容,示例代码如下:

<body>
    <ul>
    	<!-- 定义路由 -->
        <li><a href="/home">home</a></li>
        <li><a href="/about">about</a></li>
        <!-- 渲染路由对应的 UI -->
        <div id="routerView"></div>
    </ul>	
</body>
<script>
    let linkList = document.querySelectorAll('a[href]')
    for(let i=0;i<linkList.length;i++){
        linkList[i].addEventListener('click', function(e){
            e.preventDefault()
            history.pushState(null, '', this.getAttribute('href'))
            onPopState()
        })
    }
    window.addEventListener('popstate', onPopState)
        onPopState()
        function onPopState () {
            switch (location.pathname) {
            case '/home':
            	routerView.innerHTML = 'Home'
            break;
            case '/about':
            	routerView.innerHTML = 'About'
            break;
        }
    }
</script>

注意:以上代码要在服务器环境下运行,才会生效。
这种history模式存在一个问题,那就是当刷新页面的时候就会出现找不到页面的情况,即:Cannot GET /home。这主要是因为
history模式的URL地址跟普通的URL地址没有任何区别,刷新的时候服务器会去找相关的资源,我们在服务器上根本就没有这
个资源,就会出现找不到的现象。
解决这个问题,你需要做的就是在你的服务器上添加一个简单的回退路由。如果 URL不匹配任何静态资源,它应提供与你的
应用程序中的 index.html 相同的页面。漂亮依旧!
下面是nginx服务器实现的示例:

location / {
	try_files $uri $uri/ /index.html;
}

Vue框架给我们提供了一个第三方的路由框架,即:vue-router,官网地址:https://router.vuejs.org/zh/index.html。vue-router提
供了两种路由模式,可自由选择,而且在开发阶段,脚手架还帮我们处理了history找不到页面的情况。

标签:两种,hash,URL,前端,刷新,history,路由,页面
From: https://www.cnblogs.com/laraveler/p/17863919.html

相关文章

  • get /post后端获取前端int型数据
    首先post能传过去数据其次传过去的数据全部都是string类型的所以我们如果想要获取int型数据就得把传过去的string转换成int型转换只能用下面这个函数其他的试过了都不行必须用Integer.parsenInt其他的valueof之类的都不可以,这个错误主要是我向后端数据库提交数据的时候插入的数......
  • Day20.匿名函数的两种调用方式_max用法_min用法_sorted用法_map用法_filter用法_reduc
    1.匿名函数的两种调用方式: 2.匿名函数求最大和求最小:3.sorted用法和map用法:4.filter的用法:5.reduce的用法:......
  • Flask(2)-动态路由&转换器
    动态路由[email protected]("/user/<name>")2defshow_user(name):3return"Mynameis%s"%name这里定义了动态路径:/user/<name>。函数有一个参数:name。 转换器flask中,参数类型默认是string,也可以指定其类型[email protected]("/age/<int:age>")2de......
  • 记录后端不同请求方式的接口,使用vue3框架下的前端axio请求不同写法
    一.后端接口:@GetMapping("/index")publicResponseResultindex(){..} 前端接口:indexInfo().then(res=>{if(res.data.code==200){ElNotification({message:res.data.data.msg||"加载成功",ty......
  • VUE前后端分离项目,前端打包,可配置修改环境变量文件,无需再次打包
      懒得打字了,直接截图,转载自:https://blog.csdn.net/CSDN_33901573/article/details/130603111        ......
  • HCIP 路由策略
    路由策略   基于FIB转发表转发报文,FIB基于IP路由表生成   路由策略,通过修改或删除路由来影响FIB转发表,实现控制设备转发报文路径       通过修改控制平面来影响数据平面   应用场景:1.过滤路由,从路由表删除发布的路由、接收的路由   ......
  • 前端歌谣的刷题之路-第一百零五题-监听对象
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 从前端的角度来梳理微信支付(小程序、H5、JSAPI)的流程
    因业务需要,开发微信支付功能,涉及三种支付方式:JSAPI支付:微信内网页支付,需要开通微信服务号小程序支付:在小程序中支付,需要开通小程序H5支付:在手机浏览器(出微信内网爷)中网页支付使用微信支付的前提必开通微信商户号,要使用到那种的支付方式要前需在商户平台开通(要审核)。支付......
  • ASP.NET Core Web API设置响应输出的Json数据格式的两种方式
    前言在ASP.NETCoreWebAPI中设置响应输出Json数据格式有两种方式,可以通过添加System.Text.Json或Newtonsoft.JsonJSON序列化和反序列化库在应用程序中全局设置接口响应的Json数据格式,本文示例使用的是新的MinimalAPI模式。JSON序列化和反序列化库System.Text.JsonSystem.Te......
  • 基于Ubuntu系统Nginx的两种安装方式
    一、直接apt安装**如果本机安装了nginx,卸载nginxapt-get--purgeautoremovenginx检查本机是否还有nginx程序在后台运行,如果有直接kill掉。ps-ef|grepnginx1、默认版本安装方便简单,很多依赖都自动给安装好了,一个命令即可:apt-getupdateapt-getinstallnginx......