React实现组件扩展机制

        在java中,SPI机制是Java中提供的一种服务发现机制。同样,前端也很需要这种机制,这样可以做到组件可插拔,可替换,减少相互冗余。

 快速使用

1.扩展点使用

  通过使用Extension组件定义扩展点,通过name标记扩展点。

function App() {return (<div><Extension name="header"/><Extension name="content"/><Extension name="footer"/></div>);
}

2.扩展点定义

  在约定的init文件中,配置自定义的扩展点。

import {extensionManager} from "./extension";extensionManager.register("header", () => <div>header</div>);extensionManager.register("content", () => <div>content</div>);extensionManager.register("footer", () => <div>footer</div>);export default {}

3.使用效果

 

实现原理

ExtensionManager 

       这个类是全局的插件管理器,通过内置的map维护扩展点,在扩展点注册或改变后,通过钩子函数重新刷新扩展点组件。

class ExtensionManager {constructor() {this.extensions = {};this.extensionRefreshs = {};}/*** 注册扩展点*/register(key, component) {this.extensions[key] = component;// 执行刷新函数let refresh = this.extensionRefreshs[key];if (refresh) {refresh();}}/*** 获取扩展点*/getExtension(key) {return this.extensions[key];}/*** 添加刷新者*/addExtensionRefresh(key, extensionRefresh) {this.extensionRefreshs[key] = extensionRefresh;}init(){import("./init")}
}

       本来想通过react context 以及react state来存储扩展点的,但是react useContext这些hook需要在组件渲染方法内才能调用,这样注册组件功能无法实现,所以直接用js 全局变量实现了。

/*** 全局扩展点管理器*/
const extensionManager = new ExtensionManager();
extensionManager.init();

        extensionManager是全局变量;init方法会加载init文件,init文件约定注册扩展点组件。

Extension

        扩展点组件会获取extensionManager对应name的组件,并返回。同时设置刷新回调函数(基于react state实现),在扩展点变更时进行重新渲染。

/*** 扩展点组件*/
const Extension = ({name}) => {// 获取扩展点组件let Component = extensionManager.getExtension(name);// 设置刷新回调const [version, setVersion] = useState(0);extensionManager.addExtensionRefresh(name, () => {setVersion(v => v + 1);});console.log("Extension:" + name + ",version:" + version);// 返回扩展点组件return Component ? <Component/> : null;
}

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

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

相关文章

2023爱分析·知识库问答市场厂商评估报告:爱数

01 研究范围定义 研究范围&#xff1a; 大模型是指通过在海量数据上依托强大算力资源进行训练后能完成大量不同下游任务的模型。2023年以来&#xff0c;ChatGPT引爆全球大模型市场。国内众多大模型先后公测&#xff0c;众多互联网领军者投身大模型事业&#xff0c;使得大模型…

python验证服务器或容器端口是否可以用

背景 我们在验证服务器的某个端口是否可用&#xff0c;除了使用netstat&#xff0c;lsof命令来查看&#xff0c;如果端 口是在远程服务器上&#xff0c;就不用登录到机器&#xff0c;可以通过socket连接来进行测试 原理实现&#xff1a; 就简单的一个socket连接验证 socket连接…

C++ //练习 3.39 编写一段程序,比较两个string对象。再编写一段程序,比较两个C风格字符串的内容。

C Primer&#xff08;第5版&#xff09; 练习 3.39 练习 3.39 编写一段程序&#xff0c;比较两个string对象。再编写一段程序&#xff0c;比较两个C风格字符串的内容。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*******…

【SpringBoot】applicationContext.getBeansOfType(class)获取某一接口所有实现类,应用于策略模式

一、问题的提出 在实际工作中&#xff0c;我们经常会遇到一个接口及多个实现类的情况&#xff0c;并且在不同的条件下会使用不同的实现类。 二、应用场景 springboot 项目中通过 ApplicationContext.getBeansOfType(class) 获取某一接口的所有实现类&#xff0c;并通过枚举完…

mybatis面试

1.说一下对Mybatis的理解 1.1 mybatis概念 mybatis是一个半自动的持久层ORM框架 1.2 什么是ORM Object Relational Mapping【对象 关系 映射】&#xff0c;将Java中的对象与数据库中表建议映射关系 1.3 Mybatis与Hibernate对比 Mybatis是一个半自动化&#xff0c;需要手写…

Java多线程文档与入门-Thread与Runnable

一.Thread Fields Modifier and TypeField and Descriptionstatic intMAX_PRIORITY 线程可以拥有的最大优先级。 static intMIN_PRIORITY 线程可以拥有的最小优先级。 static intNORM_PRIORITY 分配给线程的默认优先级。 构造方法 Constructor and DescriptionThread() 分配一…

每日一道Java面试题:说一说Java中的异常

写在开头 任何一个程序都无法保证100%的正常运行&#xff0c;程序发生故障的场景&#xff0c;我们称之为&#xff1a;异常&#xff0c;在Java中对于异常的处理有一套完善的体系&#xff0c;今天我们就来一起学习一下。老样子&#xff0c;用一段简单的代码开始今天的学习。 我&a…

【CanvasKeyFrames - HTML5 Canvas 图片序列帧播放工具】

前言 一、CanvasKeyFrames 是什么&#xff1f; 用来做canvas动画的工具。 二、使用步骤 效果如图&#xff1a;上下波动的线条 1.引入库 代码如下&#xff08;示例&#xff09;&#xff1a; 在html中引入&#xff1a; <script src"canvas-keyframes.js"><…

中国34省市区名字之来源

本文内容是笔者根据B站视频进行整理,视频内容由@顺丰快递曹子桓 @小玄学投稿。 北京 洪武二年,朱元璋得知捷报,改“大都路”为“北平府”,取“蓟北悉平”之意。 朱棣改北平府为顺天府,又赐京号——北京。 民国时,顺天府先被改为京兆地方,又被改为北平市。 新中国成立后…

源聚达科技:开一家抖音小店有没有风险

在数字化浪潮的推动下&#xff0c;抖音小店如雨后春笋般涌现&#xff0c;成为众多创业者眼中的香饽饽。然而&#xff0c;“盛名之下&#xff0c;其实难副”&#xff0c;开设一家抖音小店并非只有风光无限&#xff0c;其背后的风险也不容小觑。 首要的风险源自激烈的市场竞争。抖…

力扣之2629.复合函数(reduceRight )

/*** param {Function[]} functions* return {Function}*/ var compose function(functions) {return function(x) {return functions.reduceRight((result, func) > func(result), x);} };/*** const fn compose([x > x 1, x > 2 * x])* fn(4) // 9*/ 说明&#x…

大模型ReAct智能体开发实战

哆啦A梦是很多人都熟悉的角色&#xff0c;包括我自己。 在成长过程中&#xff0c;我常常对他口袋里的许多小玩意感到惊讶&#xff0c;而且他知道何时使用它们。 随着大型语言模型 (LLM) 的发展趋势&#xff0c;你也可以构建一个具有相同行为方式的模型&#xff01; 我们将构建…

Redis是单线程还是多线程?

Redis最初是设计为单线程的服务器&#xff0c;其核心处理命令请求的逻辑是单线程的&#xff0c;这使得Redis非常简单而高效。核心单线程的设计意味着它使用非阻塞I/O&#xff0c;并且按顺序处理所有操作&#xff0c;从而避免了锁和多线程的竞争条件。 然而&#xff0c;在最近的…

DHCP简介

定义 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种用于集中对用户IP地址进行动态管理和配置的技术。即使规模较小的网络&#xff0c;通过DHCP也可以使后续增加网络设备变得简单快捷。 DHCP是在BOOTP&#xff08;BOOTstrap Protoc…

组装2-4人后端服务团队,选择GO还是Java?

问题&#xff1a; 组装2-4人后端服务团队&#xff0c;选择GO还是Java&#xff1f; 背景&#xff1a; 原团队python背景&#xff0c;现新业务需要用到大数据的处理&#xff0c;而python并不适合。 原业务的发展本想渐进发展中部分大数据业务改用GO实现逻辑部分&#xff0c;但新…

mysql数据库学习记录(一)

文章目录 1.mysql如何加外键关联约束&#xff1f;2.mysql&#xff0c;加外键关联约束有什么作用&#xff1f;3.在MySQL中&#xff0c;可以通过在创建数据表时使用PRIMARY KEY关键字来指定多列联合主键&#xff0c;那么请问联合主键有啥作用&#xff1f;mysql数据表设计好后&…

linux 04 进程管理

02.进程管理 ps 在命令行输入ps后按回车键就能查看当前系统中正在运行的进程。 第一. 查看进程ps 进程的状态STAT 进程的周期 fork&#xff0c;产生一个新进程 第二.排序进程表 ps aux --sort -%cpu 降序cpu %cpu 增序cpu 第三.父子关系 ps ef 第四.自定义 五.动态查看…

Spring和SpringBoot的区别是什么

Spring 和 Spring Boot 是 Java 开发领域内两个极其重要且紧密相关的框架&#xff0c;它们各自在企业级应用开发中扮演着不同的角色&#xff0c;并带来了一系列革新性的变化。以下是关于两者之间主要区别的详细分析&#xff1a; 一、设计理念与定位 Spring Framework Spring 是…

如何远程登录云服务器?登录失败是什么原因?

我用Linux云服务器&#xff0c;遇到了有关远程登录的一些问题&#xff0c;于是搜索了一些资料&#xff0c;整理了一篇文档&#xff0c;作为记录。如果你也遇到过 相似的问题&#xff0c;欢迎一起探讨&#xff01; 一、Linux云服务器的远程登录 远程登陆linux&#xff0c;使用…

【Java 数据结构】排序

排序算法 1. 排序的概念及引用1.1 排序的概念1.2 常见的排序算法 2. 常见排序算法的实现2.1 插入排序2.1.1 直接插入排序2.1.2 希尔排序( 缩小增量排序 ) 2.2 选择排序2.2.1 直接选择排序2.2.2 堆排序 2.3 交换排序2.3.1冒泡排序2.3.2 快速排序2.3.3 快速排序非递归 2.4 归并排…