自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳解使用IOC解耦React組件

開發(fā) 前端
IOC(控制反轉(zhuǎn))是一種編程思想,可以解耦組件,提高組件復(fù)用性。

[[386478]]

 IOC(控制反轉(zhuǎn))是一種編程思想,可以解耦組件,提高組件復(fù)用性。

本文包括兩部分:

  1. 介紹IOC概念
  2. IOC在React中的應(yīng)用

IOC是什么

讓我們來看個例子:

我們有個士兵的類,在類內(nèi)部會實(shí)例化一種武器:

  1. class Soldier { 
  2.   constructor() { 
  3.     // 這里我們實(shí)例化一把步槍 
  4.     this.weapon = new Rifle(); 
  5.   } 
  6.   attack() { 
  7.     this.weapon.attack(); 
  8.   } 

士兵的武器應(yīng)該是多種多樣的,但是在Soldier類內(nèi)部依賴了Rifle。

所以當(dāng)我們想將武器從步槍換為手榴彈時,只能這樣改寫:

  1. // ... 
  2. constructor() { 
  3.   // 這里我們實(shí)例化一把步槍 
  4.   // this.weapon = new Rifle(); 
  5.   // 這里我們實(shí)例化一個手榴彈 
  6.   this.weapon = new Grenade(); 
  7. // ... 

理想的狀態(tài)是:士兵不依賴具體的武器,彈藥庫里有什么武器,就用什么武器。

在這種情況下,IOC作為彈藥庫,就派上了用場。

讓我們來改寫代碼:

第一步:DI(Dependency Injection)

改寫的第一步是使士兵不依賴具體的武器,而是將武器作為依賴注入給士兵:

  1. class Soldier { 
  2.   // 將武器作為依賴注入 
  3.   constructor(weapon) { 
  4.     this.weapon = weapon; 
  5.   } 
  6.   attack() { 
  7.     this.weapon.attack(); 
  8.   } 

我們將武器的實(shí)例作為Soldier的參數(shù)傳入,于是可以如下調(diào)用:

  1. const s1 = new Soldier(new Rifle()); 
  2. const s2 = new Soldier(new Grenade()); 

這一步被稱為DI(依賴注入)。

第二步:IOC容器

那么武器從哪兒來呢?接下來來打造我們的武器庫:

  1. class Armory { 
  2.   constructor() { 
  3.     this.weapon = null
  4.   } 
  5.   setWeapon(weapon) { 
  6.     this.weapon = weapon; 
  7.   } 
  8.   getWeapon() { 
  9.     return this.weapon; 
  10.   } 

武器庫支持存武器(setWeapon)和取武器(getWeapon)。

現(xiàn)在,士兵不依賴具體武器,只需要去武器庫取武器:

  1. const armory1 = new Armory(); 
  2.  
  3. class Soldier { 
  4.   // 將武器作為依賴注入 
  5.   constructor(armory) { 
  6.     this.weapon = armory.getWeapon(); 
  7.   } 
  8.   attack() { 
  9.     this.weapon.attack(); 
  10.   } 

改造前的依賴關(guān)系:

  1. 士兵 --> 武器 

改造前原先應(yīng)用(士兵)擁有依賴的完全控制權(quán)。

改造后的依賴關(guān)系:

  1. 士兵 --> 武器庫 <-- 武器 

改造后應(yīng)用(士兵)與服務(wù)提供方(武器)解耦,他們通過IOC容器(武器庫)聯(lián)系。

從Demo也能看出IOC與DI的關(guān)系:DI是實(shí)現(xiàn)IOC編程思想的一種方式。

除了DI外,另一種實(shí)現(xiàn)方式是Dependency Lookup(依賴查找),簡稱DL。

IOC與React

在React中,為組件傳遞的props就是一種DI實(shí)現(xiàn)。

為了跨層級傳遞數(shù)據(jù),我們常使用Context API:

  1. function Name() { 
  2.   const {name} = useContext(nameContext); 
  3.   reutrn <h1>{name}</h1>; 

 context將依賴提供方(name)與依賴使用方(Name)隔離,可以看作是一種IOC實(shí)現(xiàn)。

所以說,合理使用React可以充分利用IOC的思想解耦代碼邏輯。

接下來我們看看專業(yè)的DI庫如何與React結(jié)合:

InversifyJS

InversifyJS[1]是一個強(qiáng)大、輕量的DI庫。


首先我們實(shí)現(xiàn)依賴(武器的實(shí)現(xiàn)):

  1. // armory.ts 
  2. import { injectable } from "inversify"
  3.  
  4. export interface IArmory<T> { 
  5.   attack(): T; 
  6.  
  7. @injectable() 
  8. export class Armory implements IArmory<string> { 
  9.   attack() { 
  10.     return "Rifle biubiubiu~"
  11.   } 

通過inversify提供的injectable decorator標(biāo)記該class是可被注入的。

接下來實(shí)現(xiàn)需求方(士兵的實(shí)現(xiàn)):

  1. import React from "react"
  2. import { IArmory } from "./armory"
  3.  
  4. export class Soldier extends React.Component { 
  5.   private readonly Armory: IArmory<string>; 
  6.  
  7.   render() { 
  8.     return <h1 onClick={() => this.armory.attack()}>I am a soldier</h1>; 
  9.   } 

 最后實(shí)例化IOC容器,連接需求方與依賴:

  1. import { Container } from "inversify"
  2. import { IArmory, Armory } from "./armory"
  3.  
  4. // 實(shí)例化IOC容器 
  5. export const container = new Container(); 
  6. // 將依賴方注入容器,其中armory為該依賴的ID 
  7. container.bind<IArmory<string>>("armory").to(Armory); 

至此,完成一個React組件的簡單IOC。

業(yè)務(wù)邏輯的更多依賴都可以通過注入IOC容器來實(shí)現(xiàn)解耦。

Hooks同樣可以通過inversify完成IOC,參考Dependency injection in React using InversifyJS. Now with React Hooks[2]

參考資料

[1]InversifyJS:

https://github.com/inversify/InversifyJS

[2]Dependency injection in React using InversifyJS. Now with React Hooks:

https://itnext.io/dependency-injection-in-react-using-inversifyjs-now-with-react-hooks-64f7f077cde6

 

責(zé)任編輯:姜華 來源: 魔術(shù)師卡頌
相關(guān)推薦

2020-10-16 18:41:43

command設(shè)計(jì)模式代碼

2022-09-02 08:23:12

軟件開發(fā)解耦架構(gòu)

2013-09-16 10:19:08

htmlcssJavaScript

2016-11-30 15:30:42

架構(gòu)工具和方案

2020-11-20 15:22:32

架構(gòu)運(yùn)維技術(shù)

2024-03-08 16:27:22

領(lǐng)域事件DDD項(xiàng)目跨層解耦

2025-04-18 03:02:00

2022-04-15 11:46:09

輕量系統(tǒng)解耦鴻蒙操作系統(tǒng)

2018-04-18 08:47:17

Alluxio構(gòu)建存儲

2017-03-21 21:37:06

組件UI測試架構(gòu)

2023-06-05 07:52:28

召回模型推薦系統(tǒng)

2017-12-26 15:52:31

MQ互聯(lián)網(wǎng)耦合

2022-12-28 07:45:17

2024-07-16 09:51:39

HTMLHookReact

2017-11-15 09:32:27

解耦戰(zhàn)術(shù)架構(gòu)

2022-06-07 07:58:16

流程解耦封裝

2022-07-18 09:01:58

React函數(shù)組件Hooks

2024-06-11 00:00:05

RabbitMQAMQP協(xié)議

2024-12-05 09:13:55

Go項(xiàng)目模塊

2021-06-01 09:38:19

消息隊(duì)列核心系統(tǒng)下游系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號