成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解使用IOC解耦React組件

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

[[386478]]

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

本文包括兩部分:

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

IOC是什么

讓我們來看個(gè)例子:

我們有個(gè)士兵的類,在類內(nèi)部會(huì)實(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)我們想將武器從步槍換為手榴彈時(shí),只能這樣改寫:

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

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

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

讓我們來改寫代碼:

第一步: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(依賴查找),簡(jiǎn)稱DL。

IOC與React

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

為了跨層級(jí)傳遞數(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]是一個(gè)強(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); 

至此,完成一個(gè)React組件的簡(jiǎn)單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)工具和方案

2025-05-20 07:13:22

Spring異步解耦Event

2024-03-08 16:27:22

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

2020-11-20 15:22:32

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

2025-04-18 03:02:00

2017-03-21 21:37:06

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

2018-04-18 08:47:17

Alluxio構(gòu)建存儲(chǔ)

2022-04-15 11:46:09

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

2023-06-05 07:52:28

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

2024-07-16 09:51:39

HTMLHookReact

2022-06-07 07:58:16

流程解耦封裝

2017-11-15 09:32:27

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

2017-12-26 15:52:31

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

2022-12-28 07:45:17

2022-07-18 09:01:58

React函數(shù)組件Hooks

2010-02-03 15:59:08

Android組件

2024-06-11 00:00:05

RabbitMQAMQP協(xié)議
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 手机在线观看av | 91素人| 99精品欧美一区二区三区综合在线 | 日韩乱码一二三 | 国产激情视频在线观看 | 国产精品久久久久无码av | 亚洲国产精品久久 | 国产一区二区在线播放视频 | 日韩欧美中文 | 一区二区三区网站 | 欧美午夜精品久久久久久浪潮 | 国产精品毛片无码 | 亚洲精品欧美 | 中文字幕一区二区三区精彩视频 | 国产精品久久久久久久免费观看 | 亚洲成网 | 亚洲综合日韩精品欧美综合区 | 亚洲视频精品 | 久久亚洲欧美日韩精品专区 | 亚洲网站在线播放 | 人人天天操 | 中文字幕视频在线 | 一级中国毛片 | 国产女人与拘做受免费视频 | 国产高清免费视频 | 亚洲国产一区二区三区在线观看 | 97avcc| 天天操夜夜爽 | 天天干 夜夜操 | 成人在线视频一区二区三区 | 欧美福利 | 日韩欧美第一页 | 午夜在线影院 | 亚洲成人一区二区三区 | 国产激情一区二区三区 | 日韩欧美精品在线 | 日韩成人免费 | 久久精品亚洲 | 久久久久久久亚洲精品 | 欧美成人精品在线 | 一区二区三区久久久 |