当前位置: 首页 > news >正文

React@16.x(48)路由v5.x(13)源码(5)- 实现 Switch

目录

  • 1,原生 Switch 的渲染内容
  • 2,实现

1,原生 Switch 的渲染内容

对如下代码来说:

import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
function News() {return <div className="page news">News</div>;
}function Goods() {return <div className="page goods">Goods</div>;
}export default function App() {return (<Router><Switch><Route path="/page1" component={News}></Route><Route path="/page2" component={Goods}></Route></Switch></Router>);
}

React 插件展示的内容:

在这里插入图片描述

可以看到,除了也使用了 Router 的上下文之外,只加载了一个 Route 组件

2,实现

经测试,Switch 的子元素有如下规则:

  • 如果不是 Route 组件,则会报错。
  • 如果只有一个 Route 组件,则得到的 props.children 的类型是对象
  • 如果有多个 Route 组件,则得到的 props.children 的类型是数组。

所以,除了做以上特殊的判断外,再加上渲染第一个匹配到的组件的逻辑即可。

import React, { Component } from "react";
import ctx from "./RouterContext";
import { Route } from "./Route";
import matchPath from "./matchPath";export class Switch extends Component {getChildren = ({ location }) => {let children = [];if (Array.isArray(this.props.children)) {children = this.props.children;} else if (typeof this.props.children === "object") {children = [this.props.children];}for (const child of children) {if (child.type !== Route) {throw new TypeError("子元素非 Route 组件");}const { path = "/", exact = false, strict = false, sensitive = false } = child.props;const result = matchPath(path, location.pathname, {exact,strict,sensitive,});if (result) {return child;}}return null;};render() {return <ctx.Consumer>{this.getChildren}</ctx.Consumer>;}
}

注意到,判断是否是 Route 组件,可通过引入的 Route 组件直接进行判断。

在这里插入图片描述


以上。

相关文章:

  • 手动访问mongo和ES插入和查询
  • Flutter——最详细(Drawer)使用教程
  • MySQL InnoDB Cluster 高可用集群部署
  • ​浅谈 Linux 中的 core dump 分析方法
  • 【软件测试】Postman接口测试基本操作
  • AI一键音频转文字工具 速度超快,支持实时转换,无需联网,本地整合包下载
  • 2024年中国网络安全市场全景图 (2024.7)
  • Go 语言条件语句
  • 2024 年 亚太赛 APMCM (C题)中文赛道国际大学生数学建模挑战赛 | 量子计算的物流配送 | 数学建模完整代码+建模过程全解全析
  • mybatis实现动态sql
  • EHS是什么意思啊?EHS系统有什么作用?
  • 一文带你看懂什么是营销归因模型及SaaS企业的应用
  • 汉王、绘王签字版调用封装
  • dc-3靶机渗透
  • 014-GeoGebra基础篇-快速解决滑动条的角度无法输入问题
  • 收藏网友的 源程序下载网
  • [译] React v16.8: 含有Hooks的版本
  • C语言笔记(第一章:C语言编程)
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • HTTP 简介
  • leetcode98. Validate Binary Search Tree
  • Linux Process Manage
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Magento 1.x 中文订单打印乱码
  • PAT A1050
  • use Google search engine
  • 程序员最讨厌的9句话,你可有补充?
  • 大整数乘法-表格法
  • 关于springcloud Gateway中的限流
  • 基于Android乐音识别(2)
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 前端面试总结(at, md)
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 使用 QuickBI 搭建酷炫可视化分析
  • 我的业余项目总结
  • 正则与JS中的正则
  • ​人工智能书单(数学基础篇)
  • #define,static,const,三种常量的区别
  • (13)Hive调优——动态分区导致的小文件问题
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (LeetCode 49)Anagrams
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (离散数学)逻辑连接词
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 8.0 中有哪些新的变化?
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • //TODO 注释的作用
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @Repository 注解
  • @RequestMapping用法详解
  • @Transaction注解失效的几种场景(附有示例代码)