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

  • hash 模式
  • history 模式

hash 模式

路由原理:

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

react代码实现:

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

>npx creact-react-app my-app

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

项目目录如下:

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文件夹的结构:

组件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、最后,我们来看一下显示效果:

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

react实现路由跳转_react实现hash路由相关推荐

  1. react router 路由守卫_react实现hash路由

    众所周知,目前单页面使用的路由有两种实现方式: hash 模式 history 模式 hash 模式 路由原理: 我们先来看hash模式,页面首次加载时需要在load事件中解析初始的URL,从而展示进 ...

  2. vue路由跳转子组件_vue-router之路由钩子(组件内路由钩子必须在路由组件调用,子组件没用)...

    模式 vue-router中的模式选项主要在router实例化的时候进行定义的,如下 const router = new VueRouter({ mode: 'history', // 两种类型hi ...

  3. vue 函数 路由跳转_vue中通过路由跳转的三种方式

    router-view 实现路由内容的地方,引入组件时写到需要引入的地方 需要注意的是,使用vue-router控制路由则必须router-view作为容器. 通过路由跳转的三种方式 1.router ...

  4. vue路由跳转权限_vue权限路由实现方式总结

    使用全局路由守卫 实现 前端定义好路由,并且在路由上标记相应的权限信息 const routerMap = [ { path: '/permission', component: Layout, re ...

  5. 2种方式解决vue路由跳转未匹配相应路由避免出现空白页面或者指定404页面

    1.路由全局守卫 在做项目的时候,遇到需要做路由跳转,但当用户输入错误url地址,或是其它非法url路由地址,我们或许会想到跳转至404页面.不管你有没有写一个404页面,当出现未匹配路由都需重新指定 ...

  6. html hash 路由跳转页面,路由跳转模式:hash history

    hash hash 指 url 尾巴后的 # 号以及后面的字符. 这里的 # 和 css 里的 # 是一个意思.hash 也 称作 锚点,本身是用来做页面定位的,她可以使对应 id 的元素显示在可视区 ...

  7. 阻止路由跳转得方式_vue路由拦截及页面跳转的设置方法

    路由设置:router/index.js main.js: { if (to.matched.some(res => res.meta.requireAuth)) { // 验证是否需要登陆 i ...

  8. 阻止路由跳转得方式_vue路由拦截及页面跳转设置的方法介绍

    这篇文章主要介绍了vue路由拦截及页面跳转的设置方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下 路由设置:router/index.jsexport default new Router ...

  9. Vue-router:二级路由跳转另一条路由下的子级

    前提 实验项目中,在一个 /list/user 列表中,当点击某一条时,需要跳转到 /detail/userId/user 详情下,展示详情信息. router.js const routes = [ ...

最新文章

  1. 元素分类--块级元素(特点:独占一行, 宽高边距可改)
  2. 初识Python-1
  3. 构建实时数据仓库首选,云原生数据仓库技术解密
  4. 2021年广东省高考成绩查询入口,广东省教育考试院:2021年广东高考成绩查询入口、查分系统...
  5. 问道虚拟机服务器地址,问道1.60.0905虚拟机手工启动服务端+配套客户端+启动教程+充值注册软件+配套工具...
  6. 基于时空融合的高效率多阶段视频降噪方法-EMVD
  7. java平均数函数_java求平均数的函数
  8. 字节、字位、千字节、兆字节、吉字节等概念
  9. GMS2(Gamemaker Studio 2)运行工程时遇到的问题解决
  10. web(ASP)常用代码
  11. css基础语法与注释,简述CSS注释
  12. python保存的代码在哪里_Python保存程序
  13. redis的使用(转载自:http://www.cnblogs.com/edisonfeng/p/3571870.html)
  14. 将用户输入的金额转写成中文的大写数字 c++
  15. python百度贴吧怎么爬取最早的帖子_【Python爬虫教学】百度篇·手把手教你抓取百度贴吧任意贴吧指定范围页数内的源代码...
  16. 绘图板程序设计及其具体实现 第三篇
  17. 机械图样解读——柱面和锥面
  18. HTML5智慧渔业WebGL可视化云平台
  19. imagex备份工具的用法
  20. IT“江湖”中的“剑宗”与“气宗”

热门文章

  1. 海思芯片硬件java加速_海思芯片直播延迟测试结果(小于100毫秒)
  2. java resize_OpenCV3 Java图像放大缩小 修改图像大小(Imgproc.resize)
  3. linux nohup /dev/null,nohup结合/dev/null
  4. 2020年前端招聘技术概览
  5. 如何玩转CSS的Id 和 Class选择器?
  6. css规则的样式构成,Css 基本的规则写法
  7. 漏洞工具:nmap和nessus
  8. java request获取文件_request获取路径方式
  9. js原生带缩略图的图片切换效果
  10. 自定义scoll样式