当前位置: 首页 > 科技观察

详解使用IOC解耦React组件

时间:2023-03-23 01:28:07 科技观察

IOC(InversionofControl)是一种可以解耦组件,提高组件复用性的编程思想。本文分为两部分:介绍IOC的概念IOC在React中的应用我们来看一个IOC的例子:我们有一个士兵类,类里面会实例化一个武器:classSoldier{constructor(){//这里我们实例化了一把步枪this.weapon=newRifle();}attack(){this.weapon.attack();}}Soldier的武器应该是多种多样的,但是依赖于Soldier类里面的Rifle。所以当我们想把武器从步枪改成手榴弹时,只能这样改写://...constructor(){//这里我们实例化了一把步枪//this.weapon=newRifle();//这里我们实例化一个手榴弹this.weapon=newGrenade();}//...理想状态是:士兵不依赖特定的武器,弹药库里有什么武器就用什么。在这种情况下,国际奥委会作为弹药库就派上用场了。我们重写一下代码:第一步:DI(DependencyInjection)重写的第一步是让士兵不依赖具体的武器,而是将武器作为依赖注入到士兵中:classSoldier{//将武器作为依赖注入到constructor(weapon){this.weapon=weapon;}attack(){this.weapon.attack();}}我们传入武器的实例作为Soldier的参数,所以我们可以这样调用:consts1=newSoldier(newRifle());consts2=newSoldier(newGrenade());此步骤称为DI(依赖注入)。第二步:IOC容器那么武器从哪里来呢?接下来,让我们构建我们的武器库:setWeapon)和获取武器(getWeapon)。现在,士兵不依赖具体的武器,他们只需要去军械库获取武器:constarmory1=newArmory();classSoldier{//将武器作为依赖项注入构造函数(armory){this.weapon=armory.getWeapon();}attack(){this.weapon.attack();}}改造前的依赖:Soldier-->武器改造前的原始应用程序(士兵)完全控制依赖。改造后依赖:Soldier-->Armory<--weapon改造后,应用(士兵)与服务提供者(武器)解耦,通过IOC容器(装甲)连接。从demo中也可以看出IOC和DI的关系:DI是一种实现IOC编程思想的方式。除了DI之外,另一种实现方式是依赖查找(DependencyLookup),简称DL。IOC和React在React中,传递给组件的props是一个DI实现。为了跨层传递数据,我们经常使用ContextAPI:functionName(){const{name}=useContext(nameContext);reutrn

{name}

;}context会依赖provider(name)并使用依赖Party(Name)隔离可以看成是IOC的实现。所以,合理的使用React可以充分利用IOC的思想来解耦代码逻辑。接下来我们就来看看专业的DI库是如何与React结合起来的:InversifyJSInversifyJS[1]是一个强大的轻量级DI库。首先我们实现依赖(武器的实现)://armory.tsimport{injectable}from"inversify";exportinterfaceIArmory{attack():T;}@injectable()exportclassArmoryimplementsIArmory{attack(){return"Riflebiubiubiu~";}}通过inversify提供的可注入装饰器将类标记为可注入。接下来实现需求端(士兵实现):importReactfrom"react";import{IArmory}from"./armory";exportclassSoldierextendsReact.Component{privatereadonlyArmory:IArmory;render(){returnthis.armory.attack()}>Iamasoldier;}}最后实例化IOC容器连接需求方和依赖:import{Container}from"inversify";import{IArmory,Armory}from"。/armory";//实例化IOC容器exportconstcontainer=newContainer();//在容器中注入依赖方,其中armor为依赖IDcontainer.bind>("armory").to(Armory);至此,完成了一个简单的React组件的IOC。更多的业务逻辑依赖可以通过注入IOC容器来解耦。Hooks也可以通过inversify完成IOC,参考InversifyJS在React中的依赖注入。现在有了ReactHooks[2]References[1]InversifyJS:https://github.com/inversify/InversifyJS[2]React中使用InversifyJS的依赖注入[2]React中使用InversifyJS的依赖注入。现在使用ReactHooks:https://itnext.io/dependency-injection-in-react-using-inversifyjs-now-with-react-hooks-64f7f077cde6