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
