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更紧凑。 当…

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

智能配料

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

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

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

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

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

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

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

JMX:一些入门说明

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

解释java程序中的异常机制_Java编程中的异常机制

本文旨在以初学者的角度来学习Java异常的知识,尽量简单,一些细枝末节的知识不会讲述,但不影响对知识的掌握。(比如try-catch可以嵌套,不太会这么用)1.什么是异常我们先举个例子int x 10/0;在IDE里输入这样…

配置环境变量

由于写了一个关于生成签名需要配置环境变量,所以在这里顺便把配置环境变量的步骤说一下 1.右键点击计算机,然后点击高级系统设置 2.点击环境变量,下方出现的即为系统变量,双击path就能直接修改, 转载于:https://www.cn…

使用JavaFX AnimationTimer

回想一下,给AnimationTimer起个名字可能不是一个好主意,因为它不仅可以用于动画,还可以用于测量:fps速率,碰撞检测,模拟步骤,游戏主循环等实际上,大部分时间我都看到了AnimationTime…

JavaFX 2 GameTutorial第3部分

介绍 Ť他是与一个六个部分组成的系列的第3部分的JavaFX 2游戏教程。 如果您错过了第1部分和第2部分 ,建议您在开始本教程之前先进行阅读。 回顾第二部分,我讨论了游戏循环的内部工作原理,其中我们使用动画(JavaFX Timeline &…

Selenium WebDriver + python 自动化测试框架

目标 组内任何人都可以进行自动化测试用例的编写 完全分离测试用例和自动化测试代码,就像写手工测试用例一下,编写excel格式的测试用例,包括步骤、检查点,然后执行自动化工程,即可执行功能自动化测试用例,包…

mysql游戏减少积分活动图_plantuml-绘制状态图和活动图和部署图​

背景状态图:对象的所有状态,以及基于事件发生的状态改变的过程;活动图:用例的工作流程;部署图:系统的软硬件物理体系结构;状态图基本语法元素语法说明开始和结束状态[*]标识开始和结束状态箭头-…

windows中当你的键盘无法使用时我们可以用另一种方法哦

1.使用WinR打开cmd窗口 2.输入osk回车就出现了一个虚拟的小键盘啦,当你的键盘坏掉后非常实用哦 转载于:https://www.cnblogs.com/qianzf/p/6780496.html

NetBeans 7.2引入了TestNG

代码生成的优点之一是能够查看如何使用特定的语言功能或框架。 正如我在《 NetBeans 7.2 beta:更快,更有用》一文中所讨论的那样, NetBeans 7.2 beta提供了TestNG集成 。 除了对该功能的单一引用之外,我在该帖子中没有进一步阐述&…

Javascript模块化编程(三):require.js的用法

一、为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了。后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载。下面的网页代码&…

几万条数据的excel导入到mysql_【记录】2万多条数据的Excel表格数据导入mysql数据库...

主题刚开始的时候做了两个小方案!第一个是直接Excel处理完导入,但是这个导入的话虽然简单出错率很大!第二个是想直接用php做个小程序直接导入数据,但是想了想2万条数据处理,百分之百浏览器会一直转,最后不知…

JDeveloper中的Java反编译器

Java Decompiler是一个独立的图形实用程序,显示“ .class”文件的Java源代码。 下面是Java Decompiler程序的快照 您可以从这里下载该程序 我将说明如何将此程序用作Jdeveloper中的外部工具 Java Decompiler和Jdeveloper之间的集成 您可以将此程序添加到Jdevelo…

具有Java Kickstart的MongoDB

NoSQL数据库由于其可伸缩性而变得越来越流行。 适当使用时 NoSQL数据库可以提供真正的好处。 MongoDB是使用C 编写的高度可扩展的开源NoSQL数据库。 1.安装MongoDB 您可以根据所使用的操作系统,按照MongoDB官方网站上的说明安装MongoDB,而不会遇到很多麻…