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

如何減少前端代碼的改動

開發 前端
耦合指模塊間關聯的程度。模塊之間的關聯越多,其耦合性越強,那么獨立性也就越差了。高耦合的代碼,會出現一處改,處處改的情況。高耦合的代碼,模塊之間的聯系,就像一團亂碼。

[[421388]]

本文轉載自微信公眾號「前端GoGoGo」,作者Joel  。轉載本文請聯系前端GoGoGo公眾號。

工作中,大家可能會碰到這樣的情況:

  • 接口的返回值變了,要改一堆代碼。
  • 升級了一個第三方庫,要改一堆代碼。
  • 某個組件的內部實現變了,要改一堆代碼。

如何在遇到這種情況的時候,減少前端代碼的改動呢?我分享給大家 2 個技巧:

  • 降低代碼間的耦合。
  • 業務代碼和依賴代碼之間加適配層。
  • 下面我們具體來看~

降低代碼間的耦合

耦合指模塊間關聯的程度。模塊之間的關聯越多,其耦合性越強,那么獨立性也就越差了。

高耦合的代碼,會出現一處改,處處改的情況。高耦合的代碼,模塊之間的聯系,就像一團亂碼。

解藕,就是避免對模塊內部具體實現的依賴。

下面我們來看一些具體的耦合場景,以及對應的解藕方案。

耦合 DOM

直接操作 DOM,是耦合的 DOM 的。當 DOM 結構發生變化時,操作代碼也要跟著變。下面是顯示用戶名的代碼:

HTML:

用戶名:

  1. 用戶名:<div id="user-name"></div> 
 

 

JavaScript:

  1. const userName = ... 
  2. document.querySelector('#user-name').textContent = userName 

當顯示用戶名的 id 變成其他時, JavaScript 也要變化。

解藕方法

Vue, React 之列的框架,聲明了 數據 和 視圖 的關系,不會耦合 DOM。

用 Vue:

  1. <template> 
  2.   用戶名:<div>{{userName}}</div> 
  3. </template> 
  4. <script> 
  5. new Vue({ 
  6.   ... 
  7.   data: { 
  8.     userName: ... 
  9.   } 
  10. }) 
  11. </script> 

 

用 React:

  1. function App () { 
  2.   const [userName, setUserName] = useState(...) 
  3.  
  4.   return ( 
  5.     <div> 
  6.       用戶名:<div>{userName}</div> 
  7.     </div> 
  8.   ) 

耦合其他模塊的方法或屬性

以組件為例,當父組件主動調用子組件方法,會造成耦合。例如,父組件要讓子組件獲得焦點。用 React 實現的代碼如下:

  1. <button onClick={() => inputRef.focus()}>點我獲得焦點</button> 
  2. // 子組件 
  3. <MyInput ref={inputRef}> 

如果子組件獲得焦點的方法簽名發生了變化,上面的代碼就失效了。同樣的,父組件獲取子組件的內部屬性,也會造成耦合的問題。

解藕方法

耦合方法的解決方案1

子組件監聽屬性的變化,來響應父組件的主動調用。改寫代碼如下:

  1. const [controlFocus, setControlFocus] = useState(0); 
  2. return ( 
  3.   <> 
  4.     <button onClick={() => setControlFocus(Date.now())}>點我獲得焦點</button> 
  5.     <MyInput controlFocus={controlFocus}> 
  6.   </> 

耦合方法的解決方案2

用發布訂閱模式。父組件需要主動調用子組件方法時,觸發個自定義事件,子組建監聽該自定義事件。

耦合屬性的解決方案1

將耦合的屬性放到父組件來維護,子組件改屬性時,通知父組件。如:

  1. const [value, setValue] = useState(0); 
  2. return ( 
  3.   <Comp value={value} onChange={setValue} /> 

耦合屬性的解決方案2

父組件要獲得子組件的內部屬性時,改變某個屬性。子組件監聽到該屬性的變化后,執行父組件獲取值的回調函數。

  1. const [value, setValue] = useState(0); 
  2. const [controlGetValue, setControlGetValue] = useState(0); 
  3.  
  4. return ( 
  5.   <Comp onChange={setValue} controlGetValue={controlGetValue} /> 

上面代碼中,父組件要獲取子組件內部的 value 值,只需改 controlGetValue 的值即可。

業務代碼和依賴代碼之間加適配層

如果業務代碼中有多處代碼直接調用了外部依賴,如果依賴項發生了變化,調用的地方也要改。比如:接口的請求和響應改了;升級的第三方庫的 API 發生了變化。

解決這個問題,可以在業務代碼和依賴代碼之間加適配層。當依賴項改后,只需要改適配層代碼,不需要改業務代碼。

注意:增加適配層本身會增加代碼的復雜度。因此,不要過度的加。一般在滿足以下 2 個條件的情況下加:

  1. 代碼中有多處代碼直接調用了外部依賴。
  2. 外部依賴變動的可能性比較大。

常見的外部依賴有:配置項,接口,第三方庫,全局 API。我們一個個來看。

分類配置項

將配置從邏輯中分離出來,寫成配置文件。如

  1. export const API_HOST = '/api' // 接口前綴 
  2. export const PAGE_LIMIT = 10 // 分頁時,一頁的條數 

適配接口的請求參數和響應結果

一般會加個適配層來統一對接口的請求參數和響應。適配層在請求里加 token 之類的,在響應里處理通用報錯。如:

  1. const request = (options) => { 
  2.   // 添加請求攔截器 
  3.   axios.interceptors.request.use(...) 
  4.   // 添加響應攔截器 
  5.   axios.interceptors.response.use(...) 
  6.   return axios 

對具體接口做格式化請求參數和接口的返回。

  1. export const formatFromServer = res => ... 
  2. export const formatToServer = data => ... 

適配第三方庫

如果是第三方組件,可以用個組件代理第三庫的組件。如:

  1. import { Sortable } from "react-sortablejs" 
  2. function Sort(props) { 
  3.   return ( 
  4.     <Sortable 
  5.       {...props} 
  6.       ... 
  7.     > 
  8.       ... 
  9.     </Sortable> 
  10.   ) 

如果是一個函數,可以用一個函數來代理。如:

  1. import xxx from 'xxx' 
  2. function myXxx(...args) { 
  3.   return xxx(...args) 

適配全局 API

如果我們大量代碼用了瀏覽器的可能會被廢棄的實驗性的 API??梢宰鲞@樣的配置:

  1. const someAPI = () => { 
  2.   if(window.someAPI) { 
  3.     return someAPI 
  4.   } 
  5.   // 不支持的情況。 
  6.   return () => ... 
  7. }  

總結

 

外部變化后,要減少前端代碼的改動,主要靠 降低代碼的耦合 和 增加適配代碼。但也不要過度使用哦~

 

責任編輯:武曉燕 來源: 前端GoGoGo
相關推薦

2009-07-22 07:45:00

Scala代碼重復

2022-10-20 13:05:53

patches文件生成

2019-09-16 09:05:05

前端開發技術

2011-09-19 09:49:48

2018-07-04 13:14:35

2022-06-23 09:00:00

JavaScriptHTML應用程序

2018-11-08 15:50:18

前端Javascript重用性

2021-12-16 16:35:46

CSS代碼前端

2023-05-15 07:06:36

2023-11-01 10:18:10

自動化測試工具

2021-11-22 11:30:37

JavaScript代碼瀏覽器

2020-03-06 10:05:59

前端Javascript代碼

2014-04-03 10:29:27

iOSAndroid跨界平臺

2021-02-06 14:05:29

代碼語言bug

2011-08-03 13:04:54

2022-04-27 09:24:22

前端代碼速度

2018-06-20 10:56:19

2023-04-12 13:55:16

2020-07-10 15:03:08

緩存架構計算

2023-07-18 18:44:35

光纖網絡綜合布線
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久久污网站 | 日本免费黄色 | www.狠狠操 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 一区二区三区免费在线观看 | 亚洲国产精品网站 | 欧美日韩看片 | 欧美99| 免费黄色大片 | 精品1区2区3区4区 | 国产xxxx岁13xxxxhd | 亚洲精品自拍视频 | 日韩在线精品 | 欧美一区二区三区日韩 | 国产精品无码专区在线观看 | 97超碰在线播放 | 亚洲不卡在线观看 | 精品久久香蕉国产线看观看亚洲 | 亚洲成人精品 | 亚洲国产精品第一区二区 | 精品视频www | 精品香蕉一区二区三区 | 欧美精品网站 | 亚洲视频在线看 | 在线欧美a | 国产精品福利一区二区三区 | 99re在线视频免费观看 | 99re国产视频 | 午夜精品一区二区三区在线观看 | 国产乱一区二区三区视频 | 午夜激情影院 | 亚洲最大成人综合 | 国产91九色| 欧美激情va永久在线播放 | 亚洲一区有码 | 韩日一区 | 中文字幕av亚洲精品一部二部 | 人人干人人玩 | 99re在线播放 | 婷婷在线视频 | 91精品国产高清一区二区三区 |