日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

React中的依賴注入,看這一篇就夠了!

來源: 責編: 時間:2023-09-28 10:03:16 344觀看
導讀React 組件不應該包含業務邏輯,你同意嗎? 如果是,請繼續閱讀。 如果沒有,請立即停止。 這篇文章是寫給別人的。只需 3 個步驟即可將依賴注入添加到您的 React 項目中:創建一個“容器”來放置您的依賴項創建一個鉤子 useInj

orl28資訊網——每日最新資訊28at.com

React 組件不應該包含業務邏輯,你同意嗎? 如果是,請繼續閱讀。 如果沒有,請立即停止。 這篇文章是寫給別人的。orl28資訊網——每日最新資訊28at.com

只需 3 個步驟即可將依賴注入添加到您的 React 項目中:orl28資訊網——每日最新資訊28at.com

創建一個“容器”來放置您的依賴項orl28資訊網——每日最新資訊28at.com

創建一個鉤子 useInject 來檢索依賴項orl28資訊網——每日最新資訊28at.com

使用組件中的鉤子orl28資訊網——每日最新資訊28at.com

長版

如果您對答案持觀望態度,我將嘗試為您提供一些關于為什么我們不應該這樣做的見解:orl28資訊網——每日最新資訊28at.com

React 是一個用于創建用戶界面的庫; 這個定義應該阻止我們將業務邏輯放入組件中。orl28資訊網——每日最新資訊28at.com

包含業務邏輯的組件很難閱讀、維護和測試。orl28資訊網——每日最新資訊28at.com

從組件中提取業務邏輯是一個能夠重用它的好主意。orl28資訊網——每日最新資訊28at.com

好的,如果我們從組件中取出業務邏輯,我們應該將其編寫在某個地方,例如外部類或函數中。 我們該怎么做呢? 通過使用依賴注入!orl28資訊網——每日最新資訊28at.com

什么是依賴注入,為什么要使用它

依賴注入 (DI) 是一種軟件設計模式,它將對象的創建與其使用分開。 實際上,對象的實例化不是在使用它們的代碼中創建事物,而是委托給負責創建對象并將其提供給需要它們的組件的外部實體。orl28資訊網——每日最新資訊28at.com

依賴注入旨在使代碼更加靈活、模塊化且易于測試。 DI 不是嚴格的、緊密耦合的代碼,而是允許模塊化組件輕松替換或擴展,而無需更改使用它們的代碼。orl28資訊網——每日最新資訊28at.com

此外,DI 有助于提高代碼的可讀性和可維護性,因為它使組件之間的依賴關系變得明確,并有利于復雜依賴關系的管理。orl28資訊網——每日最新資訊28at.com

總之,依賴注入的作用是:orl28資訊網——每日最新資訊28at.com

將對象的創建與其使用分開orl28資訊網——每日最新資訊28at.com

使代碼更加靈活、模塊化且易于測試orl28資訊網——每日最新資訊28at.com

提高代碼的可讀性和可維護性。orl28資訊網——每日最新資訊28at.com

React 中的依賴注入

假設我們需要開發一個管理待辦事項列表的 React 應用程序(多么奇特)。orl28資訊網——每日最新資訊28at.com

我們將有一個顯示待辦事項列表的組件。我們希望在渲染組件時從某些 API 加載列表。 由于我們不想在組件中編寫業務邏輯,因此我們將擁有一個執行 API 調用的服務,我們可以在組件中使用該服務。 如該圖所示。orl28資訊網——每日最新資訊28at.com

orl28資訊網——每日最新資訊28at.com

在此序列圖中,組件通過調用方法或函數向服務發送數據請求。 然后,服務通過發送請求從外部 API 檢索數據。 一旦接收到數據,服務就會對其進行處理并將其返回給組件。orl28資訊網——每日最新資訊28at.com

事件的順序由圖中的箭頭指示。 從API到Service的虛線箭頭表示從API檢索數據,而從Service到Component的實線箭頭表示將處理后的數據返回到Component。orl28資訊網——每日最新資訊28at.com

在實現級別,代碼可能如下所示:orl28資訊網——每日最新資訊28at.com

import React, { useState, useEffect } from 'react';import TodoService from './TodoService';function TodoList() {  const [todos, setTodos] = useState([]);  useEffect(() => {    async function fetchTodos() {      try {        const todos = await TodoService.getTodos(); // Call TodoService to get todos        setTodos(todos);      } catch (error) {        console.error(error);      }    }    fetchTodos();  }, []);  return (    <ul>      {todos.map(todo => (        <li key={todo.id}>{todo.title}</li>      ))}    </ul>  );}export default TodoList;

在此代碼中,我們定義了一個 TodoList 組件,該組件從 TodoService 調用 getTodos 方法。 我們使用 useState 掛鉤來跟蹤從服務返回的待辦事項,并使用 useEffect 掛鉤在組件安裝時獲取待辦事項。orl28資訊網——每日最新資訊28at.com

當 fetchTodos 函數被調用時,它使用await關鍵字等待getTodos方法返回todos。 一旦待辦事項返回并使用 setTodos 函數將其設置為待辦事項狀態變量。orl28資訊網——每日最新資訊28at.com

最后,我們使用地圖函數渲染待辦事項列表并顯示每個待辦事項的標題。 請注意,這是一個簡化的示例,TodoService 的實現可能會根據所使用的 API 的不同而有所不同。orl28資訊網——每日最新資訊28at.com

使用 props 進行依賴注入

import React, { useState, useEffect } from 'react';function TodoList({ todoService }) {  const [todos, setTodos] = useState([]);  useEffect(() => {    async function fetchTodos() {      try {        const todos = await todoService.getTodos(); // Call injected TodoService to get todos        setTodos(todos);      } catch (error) {        console.error(error);      }    }    fetchTodos();  }, [todoService]);  return (    <ul>      {todos.map(todo => (        <li key={todo.id}>{todo.title}</li>      ))}    </ul>  );}export default TodoList;

在此更新的代碼中,我們將 TodoService 作為 prop 注入到 TodoList 組件中。 該組件不再直接導入 TodoService,而是使用注入的服務來獲取 todo。orl28資訊網——每日最新資訊28at.com

當組件安裝時, fetchTodos 函數使用注入的 todoService 來檢索 todos。 這樣,我們可以通過將不同的服務實現傳遞給 TodoList 組件來輕松交換 TodoService 的實現。orl28資訊網——每日最新資訊28at.com

要將 TodoList 組件與 TodoService 的特定實現一起使用,我們將該服務作為 prop 傳遞,如下所示:orl28資訊網——每日最新資訊28at.com

import React from 'react';import TodoService from './TodoService';import TodoList from './TodoList';function App() {  return <TodoList todoService={TodoService} />;}export default App;

通過將 TodoService 作為 prop 傳遞給 TodoList 組件,我們實現了更加模塊化和靈活的設計,因為我們可以輕松地在 TodoService 的不同實現之間切換,而無需更改 TodoList 組件。orl28資訊網——每日最新資訊28at.com

在為組件編寫測試時,這非常有用。orl28資訊網——每日最新資訊28at.com

此時,我們有兩個問題:orl28資訊網——每日最新資訊28at.com

我們仍然需要將 TodoService 導入到 App 組件中,該組件不使用依賴注入。orl28資訊網——每日最新資訊28at.com

props 只是在應用程序中傳輸數據的有效方法之一,因為它們僅適用于嵌套層。orl28資訊網——每日最新資訊28at.com

orl28資訊網——每日最新資訊28at.com

該圖顯示了 props 如何通過組件的層次結構傳遞。 組件縮進得越多,它在組件樹中的嵌套就越深。 我們不想要這種嵌套。orl28資訊網——每日最新資訊28at.com

使用 React Context 進行依賴注入

下面是使用 TodoContext 從組件調用 TodoService 的 React 代碼示例:orl28資訊網——每日最新資訊28at.com

import React, { useState, useEffect, useContext } from 'react';import TodoContext from './TodoContext';function TodoList() {  const [todos, setTodos] = useState([]);  const todoService = useContext(TodoContext); // Retrieve TodoService from TodoContext  useEffect(() => {    async function fetchTodos() {      try {        const todos = await todoService.getTodos(); // Call TodoService from TodoContext to get todos        setTodos(todos);      } catch (error) {        console.error(error);      }    }    fetchTodos();  }, [todoService]);  return (    <ul>      {todos.map(todo => (        <li key={todo.id}>{todo.title}</li>      ))}    </ul>  );}export default TodoList;

在此代碼中,我們使用 useContext 掛鉤從 TodoContext 檢索 TodoService。 然后我們使用檢索到的 todoService 來獲取 todos。orl28資訊網——每日最新資訊28at.com

useEffect 鉤子用于在組件安裝時獲取待辦事項。 fetchTodos 函數使用檢索到的 todoService 來檢索 todos 并將它們設置為 todos 狀態變量。orl28資訊網——每日最新資訊28at.com

要使用此組件,我們首先創建一個 TodoContext 并將組件包裝在其中,如下所示:orl28資訊網——每日最新資訊28at.com

import React from 'react';import TodoContext from './TodoContext';import TodoService from './TodoService';import TodoList from './TodoList';function App() {  return (    <TodoContext.Provider value={TodoService}>      <TodoList />    </TodoContext.Provider>  );}export default App;

在此示例中,我們創建一個 TodoContext 并將 TodoService 作為其值傳遞。 然后,我們將 TodoList 組件包裝在 TodoContext.Provider 組件內,以便 TodoList 組件可以使用 useContext 掛鉤從上下文中檢索 TodoService。orl28資訊網——每日最新資訊28at.com

使用控制反轉容器 (IOC) 進行依賴注入

使用這個上下文概念,我們可以再采取一步,使用控制反轉容器。orl28資訊網——每日最新資訊28at.com

等等,什么是控制反轉容器 (IoC)?orl28資訊網——每日最新資訊28at.com

在 React 中,IoC(控制反轉)容器是一種工具,可讓您管理應用程序中不同組件和服務之間的依賴關系。 它提供了一種方法來定義和注冊服務或對象(依賴項)一次,然后將它們注入到依賴它們的其他組件中。 這有助于解耦組件,并使您的應用程序更加模塊化且更易于維護。orl28資訊網——每日最新資訊28at.com

React 中的 IoC 容器通常通過提供一個中央注冊表來工作,該注冊表引用可用作依賴項的所有對象。 組件可以從容器請求這些依賴項,而不是直接創建它們。 這種方法還可以輕松地用替代實現替換依賴項或模擬它們進行測試。orl28資訊網——每日最新資訊28at.com

React 有幾種流行的 IoC 容器,例如 InversifyJS、Awilix 和 BottleJS,它們提供了構造函數注入、屬性注入和自動依賴解析等各種功能。 一些 IoC 容器比其他容器更復雜,因此選擇適合您的項目需求和復雜程度的容器非常重要。orl28資訊網——每日最新資訊28at.com

在我們的例子中,我們將從頭開始編寫一個示例,如下所示:orl28資訊網——每日最新資訊28at.com

import React, { createContext, useContext } from 'react';// Create a new context for the containerconst ContainerContext = createContext();// Define a component that provides the container to its childrenconst ContainerProvider = ({ container, children }) => {  return <ContainerContext.Provider value={container}>{children}</ContainerContext.Provider>;};// Define a hook to access the container from within a componentconst useContainer = () => {  const container = useContext(ContainerContext);  if (!container) {    throw new Error('Container not found. Make sure to wrap your components with a ContainerProvider.');  }  return container;};// Define a hook to inject dependencies from the containerconst useInject = (identifier) => {  const container = useContainer();  return container.resolve(identifier);};// Example usage:const MyService = () => {  return { foo: 'bar' };};const MyComponent = () => {  const myService = useInject('myService');  return <div>{myService.foo}</div>; // Output: 'bar'};const container = {  registry: {    myService: MyService()  },  resolve(identifier) {    if (!this.registry.hasOwnProperty(identifier)) {      throw new Error(`Object with identifier ${identifier} not found in container`);    }    return this.registry[identifier];  }};const App = () => {  return (    <ContainerProvider container={container}>      <MyComponent />    </ContainerProvider>  );};

在此示例中,我們創建一個 ContainerProvider 組件,該組件將容器對象作為 prop,并使用 ContainerContext 上下文將其提供給其子組件。 我們還定義了一個 useContainer 鉤子,可用于從組件內檢索容器。orl28資訊網——每日最新資訊28at.com

然后,我們定義一個 MyService 對象并將其添加到容器對象的注冊表屬性中。 我們還在容器對象上定義了一個解析方法,該方法采用標識符并從注冊表中檢索相應的對象。 在本例中,resolve 方法返回 MyService 對象。orl28資訊網——每日最新資訊28at.com

我們用 ContainerProvider 包裝 MyComponent,并將容器對象作為 prop 傳入,然后渲染 App 組件,該組件渲染用 ContainerProvider 包裝的 MyComponent。 當呈現 MyComponent 時,它會從容器中檢索 myService 依賴項,并將其 foo 屬性呈現到屏幕上。orl28資訊網——每日最新資訊28at.com

在此代碼中,我們添加了一個 useInject 掛鉤,該掛鉤將標識符作為參數并從容器中檢索相應的對象。 useInject 鉤子在內部調用 useContainer 來檢索容器,然后調用容器上的resolve 方法來檢索對象。orl28資訊網——每日最新資訊28at.com

接下來,我們創建一個 MyComponent,它使用 useInject 掛鉤從容器中檢索 myService 依賴項,并將其 foo 屬性呈現到屏幕上。orl28資訊網——每日最新資訊28at.com

最后,我們渲染 App 組件,它渲染用 ContainerProvider 包裝的 MyComponent。 當呈現 MyComponent 時,它使用 useInject 掛鉤從容器中檢索 myService 依賴項,并將其 foo 屬性呈現到屏幕上。orl28資訊網——每日最新資訊28at.com

總之,依賴注入是一種設計模式,它允許更靈活、模塊化且易于測試的代碼。 它將對象的創建與其使用分開,使組件之間的依賴關系變得明確并促進復雜依賴關系的管理。orl28資訊網——每日最新資訊28at.com

在 React 中,依賴注入可以通過將服務作為 props 注入或使用容器通過鉤子為組件提供依賴關系來實現。 這種做法可以使代碼更清晰、更易于維護,從而更容易重用業務邏輯和管理依賴項。orl28資訊網——每日最新資訊28at.com

遵循此模式可以提高 React 代碼的可讀性、可維護性和可測試性。orl28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-11735-0.htmlReact中的依賴注入,看這一篇就夠了!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: @Transactional注解使用以及事務失效的場景

下一篇: Java中數據共享和同步問題,導致線程安全性問題和競態條件

標簽:
  • 熱門焦點
  • K60 Pro官方停產 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經透露了,Redmi K60 Pro已經停產且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產之后
  • 盧偉冰長文解析K60至尊版 對Redmi有著里程碑式的意義

    在今天的Redmi后性能時代戰略發布會結束之后,Redmi總經理盧偉冰又帶來了一篇長文,詳解了為什么 Redmi 要開啟后性能時代?為什么選擇和 MediaTek、Pixelworks 深度合作?以及后性
  • 6月安卓手機性價比榜:Note 12 Turbo斷層式碾壓

    6月份有一個618,雖然這是京東周年慶的日子,但別的電商也都不約而同的跟進了,反正促銷沒壞處,廠商和用戶都能滿意。618期間一些產品也出現了歷史低價,那么各個價位段的產品性價比
  • 量化指標是與非:挽救被量化指標扼殺的技術團隊

    作者 | 劉新翠整理 | 徐杰承本文整理自快狗打車技術總監劉新翠在WOT2023大會上的主題分享,更多精彩內容及現場PPT,請關注51CTO技術棧公眾號,發消息【WOT2023PPT】即可直接領取
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 2天漲粉255萬,又一賽道在抖音爆火

    來源:運營研究社作者 | 張知白編輯 | 楊佩汶設計 | 晏談夢潔這個暑期,旅游賽道徹底火了:有的「地方」火了&mdash;&mdash;貴州村超旅游收入 1 個月超過 12 億;有的「博主」火了&m
  • 華為Mate 60系列用上可變靈動島:正式版體驗將會更出色

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • 3699元!iQOO Neo8 Pro頂配版今日首銷:1TB UFS 4.0同價位唯一

    5月23日,iQOO推出了全新的iQOO Neo8系列,包含iQOO Neo8和iQOO Neo8 Pro兩個版本,其中標準版搭載高通驍龍8+,而Pro版更是首發搭載了聯發科天璣9200+旗艦
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲欧洲99久久| 亚洲精品国产拍免费91在线| 欧美午夜精品久久久| 中文网丁香综合网| 亚洲国产欧美日韩精品| 亚洲国产精品第一区二区三区| 亚洲福利视频一区| 一区二区成人精品| 日韩视频一区二区三区在线播放免费观看| 国外成人性视频| 国产精品区二区三区日本| 国产日韩视频| 国产精品一区亚洲| 国产老肥熟一区二区三区| 国产精品s色| 国产亚洲毛片在线| 亚洲人精品午夜在线观看| 亚洲在线中文字幕| 另类天堂av| 国产精品国码视频| 亚洲国产女人aaa毛片在线| 亚洲图片激情小说| 久久综合五月| 国产精品久久久久久久免费软件| 好吊一区二区三区| 亚洲午夜视频在线| 免费成人av| 欧美激情在线观看| 国产日韩欧美成人| 狠狠爱www人成狠狠爱综合网| 国产亚洲人成a一在线v站 | 欧美1区2区3区| 久热精品视频在线观看| 欧美日韩一区二区三区在线视频| 黄色成人在线网站| 亚洲第一伊人| 国产综合欧美在线看| 伊人久久av导航| 亚洲国产导航| 欧美一级播放| 久久久一区二区| 老司机凹凸av亚洲导航| 能在线观看的日韩av| 国产精品视频1区| 国产一区二区三区在线观看视频 | 久久精品国产亚洲a| 欧美日韩在线另类| 欲香欲色天天天综合和网| 亚洲免费视频在线观看| 欧美人妖另类| 一区二区三区中文在线观看| 亚洲午夜精品久久| 欧美岛国激情| 狠狠久久婷婷| 性欧美长视频| 欧美不卡一卡二卡免费版| 国产视频欧美| 小黄鸭精品密入口导航| 欧美午夜激情视频| 国产视频一区在线观看| 激情综合亚洲| 亚洲免费成人| 亚洲一区二区精品在线| 欧美剧在线观看| 国产欧美日韩免费| 亚洲成色999久久网站| 午夜亚洲一区| 蜜桃精品一区二区三区| 欧美三级免费| 亚洲日韩视频| 午夜免费久久久久| 久久只有精品| 欧美午夜免费电影| 日韩午夜av电影| 欧美中文字幕第一页| 欧美成人按摩| 国产精品视频内| 在线亚洲欧美| 欧美日韩精品综合| 好看不卡的中文字幕| 欧美在线亚洲在线| 国产女主播一区二区三区| 亚洲激情一区| 欧美v日韩v国产v| 国产欧美日本| 先锋影音国产一区| 欧美人与禽性xxxxx杂性| 91久久香蕉国产日韩欧美9色| 亚洲网在线观看| 欧美日韩亚洲成人| 一区二区日韩欧美| 久久香蕉国产线看观看网| 免费久久99精品国产| 国产精品二区三区四区| 在线综合欧美| 国产精品乱码一区二三区小蝌蚪| 亚洲成人在线观看视频| 蜜桃av综合| 老牛影视一区二区三区| 黄色成人在线免费| 亚洲一区二区三区777| 欧美午夜免费电影| 亚洲国产精品99久久久久久久久| 亚洲欧美综合| 欧美日韩不卡合集视频| 狠狠色狠狠色综合| 老司机免费视频久久| 国产欧美 在线欧美| 这里只有精品丝袜| 欧美.www| 一区二区高清在线| 国产精品视频男人的天堂| 亚洲毛片av| 欧美日韩在线播放一区| 亚洲制服丝袜在线| 国产亚洲视频在线观看| 亚洲影音一区| 欧美理论在线| 中文一区二区| 国产欧美91| 玖玖精品视频| 日韩一级欧洲| 欧美激情成人在线视频| 一本久久a久久免费精品不卡| 欧美ab在线视频| 99精品视频免费观看视频| 国产精品美女一区二区在线观看 | 久久露脸国产精品| 在线精品视频在线观看高清| 欧美激情一区| 亚洲国产专区校园欧美| 久久婷婷综合激情| 国产一区二区三区电影在线观看| 久久天天躁狠狠躁夜夜av| 136国产福利精品导航网址| 欧美国产丝袜视频| 亚洲精品国产拍免费91在线| 久久综合九色欧美综合狠狠| 亚洲美女区一区| 欧美日韩ab| 99re在线精品| 国产亚洲精品久久飘花| 欧美国产欧美亚洲国产日韩mv天天看完整 | 国产亚洲一区在线| 欧美激情免费在线| 亚洲国产综合91精品麻豆| 欧美午夜精彩| 亚洲欧美视频一区二区三区| 悠悠资源网久久精品| 久久久久青草大香线综合精品| 国产午夜精品理论片a级探花| 亚洲欧美电影在线观看| 在线观看亚洲| 嫩草国产精品入口| 亚洲欧洲精品成人久久奇米网| 欧美电影在线观看完整版| 亚洲人精品午夜| 国产欧美日韩综合| 欧美韩日视频| 一区二区成人精品| 精品成人一区| 欧美激情亚洲激情| 亚洲精品久久视频| 欧美日韩精品一区| 久久性天堂网| 日韩视频久久| 国产精品羞羞答答xxdd| 久久成人一区二区| 亚洲福利视频一区二区| 国产日韩欧美精品在线| 久久一区二区精品| 亚洲欧美日韩一区在线| 欧美激情在线狂野欧美精品| 欧美影院视频| 亚洲天堂激情| 亚洲免费不卡| 在线观看欧美精品| 国产欧美日韩一区| 国产精品99一区二区| 欧美国产日韩精品| 亚洲一区日韩| 日韩视频一区二区在线观看| 精品成人一区| 欧美精品国产| 麻豆freexxxx性91精品| 欧美综合77777色婷婷| 亚洲国内在线| 国产精品v日韩精品| 欧美男人的天堂| 欧美福利影院| 老司机精品久久| 亚洲视频狠狠| 夜夜爽www精品| 国产一区二区三区在线观看视频| 免费一级欧美片在线观看| 久久精品欧洲| 亚洲精品资源| 国产一区高清视频| 欧美区在线观看| 久久精品人人做人人综合 | 午夜欧美大尺度福利影院在线看| 宅男在线国产精品| 一本色道88久久加勒比精品 | 亚洲日本一区二区|