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

詳解使用IOC解耦React組件

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

[[386478]]

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

本文包括兩部分:

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

IOC是什么

讓我們來(lái)看個(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)是:士兵不依賴具體的武器,彈藥庫(kù)里有什么武器,就用什么武器。

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

讓我們來(lái)改寫代碼:

第一步: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容器

那么武器從哪兒來(lái)呢?接下來(lái)來(lái)打造我們的武器庫(kù):

  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.   } 

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

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

  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. 士兵 --> 武器庫(kù) <-- 武器 

改造后應(yīng)用(士兵)與服務(wù)提供方(武器)解耦,他們通過(guò)IOC容器(武器庫(kù))聯(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)。

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

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

InversifyJS

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


首先我們實(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.   } 

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

接下來(lái)實(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ù)邏輯的更多依賴都可以通過(guò)注入IOC容器來(lái)實(shí)現(xiàn)解耦。

Hooks同樣可以通過(guò)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é)任編輯:姜華 來(lái)源: 魔術(shù)師卡頌
相關(guān)推薦

2020-10-16 18:41:43

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

2022-09-02 08:23:12

軟件開(kāi)發(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-05-20 07:13:22

Spring異步解耦Event

2025-04-18 03:02:00

2022-04-15 11:46:09

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

2017-03-21 21:37:06

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

2018-04-18 08:47:17

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

2023-06-05 07:52:28

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

2024-07-16 09:51:39

HTMLHookReact

2017-12-26 15:52:31

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

2022-12-28 07:45:17

2022-06-07 07:58:16

流程解耦封裝

2017-11-15 09:32:27

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

2022-07-18 09:01:58

React函數(shù)組件Hooks

2024-06-11 00:00:05

RabbitMQAMQP協(xié)議

2021-06-01 09:38:19

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

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

主站蜘蛛池模板: 欧美黄视频 | 亚洲精品日韩一区二区电影 | 久久丁香 | 国产精品久久 | 亚洲视频免费在线观看 | 日韩欧美综合在线视频 | 中文字幕亚洲国产 | 久久综合久久综合久久综合 | 伊人春色成人 | 午夜免费视频 | 日日爽 | 午夜男人天堂 | 密色视频| 天天操夜夜看 | 香蕉婷婷 | 日韩av在线不卡 | 福利影院在线看 | 亚洲一二三在线观看 | 国产精品久久国产精品 | 男插女下体视频 | 日韩精品一区二区三区在线播放 | 一区二区三区视频免费观看 | 欧美lesbianxxxxhd视频社区 | 欧美日韩中文字幕 | 亚欧午夜| www.日韩系列 | 91中文在线观看 | 天天拍天天操 | 日韩视频免费 | 日日夜夜免费精品 | 自拍视频精品 | 国产精品国产成人国产三级 | 久久久一二三区 | 成人欧美一区二区 | 亚洲第一天堂无码专区 | 国产丝袜一区二区三区免费视频 | 日韩精品视频在线 | 欧美激情视频一区二区三区免费 | 日本三级在线视频 | 91婷婷韩国欧美一区二区 | 成人久久18免费网站 |