react实现路由跳转_react实现hash路由

众所周知,目前单页面使用的路由有两种实现方式:

  • hash 模式
  • history 模式

hash 模式

路由原理:

我们先来看hash模式,页面首次加载时需要在load事件中解析初始的URL,从而展示进入的页面。当 # 后面的哈希值发生变化时,不会向服务器请求数据,可以通过 hashchange 事件来监听到 URL 的变化,从而进行跳转页面。

0a706913fdee5bdc4b99a313b3e8d5e8.png

react代码实现:

1、使用react脚手架构建一个react的项目:

>npx creact-react-app my-app

2、创建两个组件 home.js 、 setting.js,使用hash路由来实现两个组件的切换。

项目目录如下:

aa068ca321eb51884308bf93c7499d7b.png

3、在App.js文件中,我们需要实现如下的效果:

import React from 'react'import Home from './pages/home'import Setting from './pages/setting'import {Router, Route, Link} from './router'export default function App() {  return (    首页      设置      )}

整个结构使用Router组件包裹,由Route组件承载每一项路由的组件,由Link标签实现切换。那么我们来看一下router内部如何实现的。

4、先来看一下router文件夹的结构:

e6f2655c84c5fec229706a551343fd08.png

组件Router,Route,Link在router/Route.js,router/Route.js,route/Link.js三个文件中实现。router/index.js将三个组件集成方便外部调用。来看一下index.js的内容:

export {default as Router} from './Router'export {default as Route} from './Route'export {default as Link} from './Link'

5、整个路由项目被Router标签包裹,实际上需要达到共享路由当前地址的目的,借助react中的 context 来实现。同时Router组件需要在项目首次加载时解析当前的hash值,并且监听hash值的变化,根据hash值,来通知 children 当前的路由地址。代码如下:

import React, { Component, createContext } from "react";// 用于共享路由当前hash地址export const RouterContext = createContext();export default class Router extends Component {  state = {    path: "/",//路由当前hash地址  };  // 解析hash地址  getPath() {    let path = window.location.hash;    if (path) {      path = path.replace("#", "");    } else {      path = "/";    }    this.setState({ path });  }  componentDidMount() {    // 先解析第一次的hash值    this.getPath();    // 监听之后hash值的变化,进入路由和返回    window.onhashchange = (ev) => {      this.getPath();    };  }  render() {    // 使用context共享路由当前hash地址    return (              {this.props.children}          );  }}

6、Route组件是根据当前的hash地址判断当前的Route承载的组件是否应该显示,代码如下:

import React, {useContext} from 'react'import {RouterContext} from './Router'export default function Route(props) {  //获得当前hash地址  const context = useContext(RouterContext);  return (    //当前的hash地址和组件配置的地址比较,相等就进入路由对应的组件,不想等则不显示组件。    context.path === props.path ?  : null  );}

注:如果需要实现路由嵌套和动态路由,当前的hash地址和组件配置的地址比较就不是使用===判断这么简单了,在这里我不做陈述,感兴趣的话可以自己研究一下。

7、Link组件只需要触发hash路由的切换。代码如下:

import React from 'react'export default function Link({to, children}) {  //Link组件实现hash路由的切换,故只需要通过a标签切换hash值  return (          {children}      )}

8、最后,我们来看一下显示效果:

e2355953c25ff2a5311debd2f30b56ca.png

history 模式的实现,详见下回分解~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372327.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的Google协议缓冲区

总览 协议缓冲区是一种用于结构化数据的开源编码机制。 它是由Google开发的,旨在实现语言/平台中立且可扩展。 在本文中,我的目的是介绍Java平台上下文中协议缓冲区的基本用法。 Protobuff比XML更快,更简单,并且比JSON更紧凑。 当…

匈牙利哦模板 二分匹配 完全匹配问题

匈牙利算法的核心思想就是 腾空间, 有条件 创造,没条件也要创造! bool find(int x){int i,j;for (j1;j<m;j){ //扫描每个被匹配的人 if (line[x][j]true && used[j]false) //如果有关系并且还没有标记过(这里标记的意思是这次查找曾试图改变过的归属问题&a…

ThinkPHP 中验证码的看不清切换

<!--HTML页面--> <!DOCTYPE html><html><head> <title></title></head><body><script type"text/javascript" src"__PUBLIC__/js/jquery-1.8.2.min.js"></script><form action"{:U(H…

mysql从表截取信息_mysql中循环截取用户信息并插入到目标表对应的字段中

操作环境&#xff1a;有表game_list&#xff0c;字段&#xff1a;uid&#xff0c;score1&#xff0c;score2&#xff0c;seat_id&#xff0c;last_update&#xff1b;传入参数为i_player_detail &#xff0c;传入的值为多个用户的id、之前分数、之后分数、座位号&#xff0c;每…

Java中的数组,列表,集合,映射,元组,记录文字

有时&#xff0c;当我对JavaScript的强大功能和表现力感到兴奋时&#xff0c;我发现自己错过了Java世界中的一两个功能。 除了lambda表达式/闭包或任何您想称为“匿名函数”的东西之外&#xff0c;它还对数组&#xff0c;数组&#xff0c;列表&#xff0c;集合&#xff0c;映射…

mysql锁表问题的解决方法_MYSQL锁表问题的解决方法

本文实例讲述了MYSQL锁表问题的解决方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;很多时候&#xff01;一不小心就锁表&#xff01;这里讲解决锁表终极方法&#xff01;案例一mysql>show processlist;参看sql语句一般少的话mysql>kill thread_id;就可以解…

linux——(1)初识linux

linux有窗口管理员环境和纯文本界面环境&#xff0c;同时linux默认提供6个Terminal来让用户登录。crtlaltF1-6可自由切换。其中如果窗口管理员环境处于运行状态&#xff0c;那么可以按crtlaltF7直接切过去。 常用命令&#xff1a; cd [dir] #进入dir目录下 ls #列出当前目录下的…

4.26学习成果

哇&#xff0c;今天终于开始接触Web了&#xff0c;感觉有点小兴奋&#xff0c;这几天看来那个视频感觉挺有趣的&#xff0c;挺奇妙的。看到人家敲代码&#xff0c;感觉好厉害。但是感觉不懂&#xff0c;所以&#xff0c;要努力学习了。 今天的学习成果&#xff1a; 网页由什么组…

将Glassfish 3连接到外部ActiveMQ 5代理

介绍 在ONVZ&#xff0c;我们将Glassfish 3用作开发和生产应用服务器&#xff0c;我们对其性能和稳定性以及周围的广大社区感到非常满意。 我很少遇到在stackoverflow或java.net上没有匹配解决方案的问题。 作为我们开源策略的一部分&#xff0c;我们还运行了一个定制的ActiveM…

esp8266 lcd 天气_ESP8266 显示实时天气信息

代码文件getdata.h#include #include #include #include #include #include #include #define DEBUG 1#define MAX_CONTENT_SIZE 2000const char* ssid "weather";const char* password "mymymymy";WiFiClient client;HTTPClient http;char response[MAX…

【VS开发】visual studio 2015的NuGet Manager解决方案管理功能

NuGet的官方说明是&#xff1a;NuGet是一款Visual Studio的扩展&#xff0c;它可以简单的安装、升级开源库和工具。 官网地址&#xff1a;http://www.nuget.org/ 官网最醒目的位置就是下载链接&#xff0c;安装完成后我们来快速体验一把。 手上有个小项目需要使用到json格式&am…

五. 面向对象高级特性4. 接口的概念和使用

在抽象类中&#xff0c;可以包含一个或多个抽象方法&#xff1b;但在接口(interface)中&#xff0c;所有的方法必须都是抽象的&#xff0c;不能有方法体&#xff0c;它比抽象类更加“抽象”。接口使用 interface 关键字来声明&#xff0c;可以看做是一种特殊的抽象类&#xff0…

智能配料

我们都有多少次听说“分批处理”会增加延迟&#xff1f; 作为对低延迟系统充满热情的人&#xff0c;这让我感到惊讶。 以我的经验&#xff0c;正确完成批处理不仅可以提高吞吐量&#xff0c;还可以减少平均延迟并保持一致。 那么&#xff0c;批处理如何神奇地减少延迟呢&#x…

mysql从myisam_将MySQL从MyISAM转换成InnoDB错误和解决办法

原来自己用的是为了装的&#xff0c; 所以在设置database usage(如下图1)的时候按照discuz官方的建议&#xff0c;选的都是Non-Transactional Database Only(只支持MyISAM数据引擎的非事务数据库)&#xff0c;用MyISAM数据库&#xff0c;还没涉及到需要InnoDB&#xff0c;因此打…

相似性度量中用到的一些距离函数

本文目录 1. 欧氏距离 2. 曼哈顿距离 3. 切比雪夫距离 4. 闵可夫斯基距离 5. 标准化欧氏距离 6. 马氏距离 7. 汉明距离 8. 杰卡德距离 & 杰卡德相似系数 9. 相关系数 & 相关距离 10. 信息熵 1. 欧氏距离(Euclidean Distance) 欧氏距离是最易于理解的一种距离计算方法&a…

Spring 3.1配置文件和Tomcat配置

Spring 3.1引入了非常有用的功能&#xff0c;称为配置文件 。 因此&#xff0c;它易于构建&#xff0c;可以在所有环境&#xff08;开发&#xff0c;测试&#xff0c;生产等&#xff09;中部署的软件包。 通过定义系统属性spring.profiles.active&#xff0c; Spring允许我们使…

计算1~n之间所有奇数之和_所有奇数长度子数组的和

所有奇数长度子数组的和题目&#xff1a;给你一个正整数数组 arr &#xff0c;请你计算所有可能的奇数长度子数组的和。子数组 定义为原数组中的一个连续子序列。请你返回 arr 中 所有奇数长度子数组的和 。示例 1&#xff1a;输入&#xff1a;arr [1,4,2,5,3]输出&#xff1a…

MYSQL AND OR的联用

MYSQL AND OR的联用 MYSQL中”AND”和”OR”都是条件控制符。”AND”是求交集&#xff0c;而”OR”则是求并集&#xff0c;非常多情况下&#xff0c;须要联用它们两个。下面是两张表,我仅仅列出实用的字段。 Table:student_score 学生成绩 sid(学生ID) cid(课程ID) score(分数)…

九度oj 题目1456:胜利大逃亡

题目描述&#xff1a;Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,I…

JMX:一些入门说明

JMX&#xff08;Java管理扩展&#xff09;是一种J2SE技术&#xff0c;可以管理和监视Java应用程序。 基本思想是实现一组管理对象&#xff0c;并将实现注册到平台服务器&#xff0c;在平台服务器上&#xff0c;可以使用一组连接器或适配器从本地或远程调用这些实现到JVM。 一个…