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

如何減少前端代碼的改動(dòng)

開發(fā) 前端
耦合指模塊間關(guān)聯(lián)的程度。模塊之間的關(guān)聯(lián)越多,其耦合性越強(qiáng),那么獨(dú)立性也就越差了。高耦合的代碼,會(huì)出現(xiàn)一處改,處處改的情況。高耦合的代碼,模塊之間的聯(lián)系,就像一團(tuán)亂碼。

[[421388]]

本文轉(zhuǎn)載自微信公眾號(hào)「前端GoGoGo」,作者Joel  。轉(zhuǎn)載本文請(qǐng)聯(lián)系前端GoGoGo公眾號(hào)。

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

  • 接口的返回值變了,要改一堆代碼。
  • 升級(jí)了一個(gè)第三方庫(kù),要改一堆代碼。
  • 某個(gè)組件的內(nèi)部實(shí)現(xiàn)變了,要改一堆代碼。

如何在遇到這種情況的時(shí)候,減少前端代碼的改動(dòng)呢?我分享給大家 2 個(gè)技巧:

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

降低代碼間的耦合

耦合指模塊間關(guān)聯(lián)的程度。模塊之間的關(guān)聯(lián)越多,其耦合性越強(qiáng),那么獨(dú)立性也就越差了。

高耦合的代碼,會(huì)出現(xiàn)一處改,處處改的情況。高耦合的代碼,模塊之間的聯(lián)系,就像一團(tuán)亂碼。

解藕,就是避免對(duì)模塊內(nèi)部具體實(shí)現(xiàn)的依賴。

下面我們來看一些具體的耦合場(chǎng)景,以及對(duì)應(yīng)的解藕方案。

耦合 DOM

直接操作 DOM,是耦合的 DOM 的。當(dāng) DOM 結(jié)構(gòu)發(fā)生變化時(shí),操作代碼也要跟著變。下面是顯示用戶名的代碼:

HTML:

用戶名:

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

 

JavaScript:

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

當(dāng)顯示用戶名的 id 變成其他時(shí), JavaScript 也要變化。

解藕方法

Vue, React 之列的框架,聲明了 數(shù)據(jù) 和 視圖 的關(guān)系,不會(huì)耦合 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.   ) 

耦合其他模塊的方法或?qū)傩?/h3>

以組件為例,當(dāng)父組件主動(dòng)調(diào)用子組件方法,會(huì)造成耦合。例如,父組件要讓子組件獲得焦點(diǎn)。用 React 實(shí)現(xiàn)的代碼如下:

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

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

解藕方法

耦合方法的解決方案1

子組件監(jiān)聽屬性的變化,來響應(yīng)父組件的主動(dòng)調(diào)用。改寫代碼如下:

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

耦合方法的解決方案2

用發(fā)布訂閱模式。父組件需要主動(dòng)調(diào)用子組件方法時(shí),觸發(fā)個(gè)自定義事件,子組建監(jiān)聽該自定義事件。

耦合屬性的解決方案1

將耦合的屬性放到父組件來維護(hù),子組件改屬性時(shí),通知父組件。如:

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

耦合屬性的解決方案2

父組件要獲得子組件的內(nèi)部屬性時(shí),改變某個(gè)屬性。子組件監(jiān)聽到該屬性的變化后,執(zhí)行父組件獲取值的回調(diào)函數(shù)。

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

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

業(yè)務(wù)代碼和依賴代碼之間加適配層

如果業(yè)務(wù)代碼中有多處代碼直接調(diào)用了外部依賴,如果依賴項(xiàng)發(fā)生了變化,調(diào)用的地方也要改。比如:接口的請(qǐng)求和響應(yīng)改了;升級(jí)的第三方庫(kù)的 API 發(fā)生了變化。

解決這個(gè)問題,可以在業(yè)務(wù)代碼和依賴代碼之間加適配層。當(dāng)依賴項(xiàng)改后,只需要改適配層代碼,不需要改業(yè)務(wù)代碼。

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

  1. 代碼中有多處代碼直接調(diào)用了外部依賴。
  2. 外部依賴變動(dòng)的可能性比較大。

常見的外部依賴有:配置項(xiàng),接口,第三方庫(kù),全局 API。我們一個(gè)個(gè)來看。

分類配置項(xiàng)

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

  1. export const API_HOST = '/api' // 接口前綴 
  2. export const PAGE_LIMIT = 10 // 分頁(yè)時(shí),一頁(yè)的條數(shù) 

適配接口的請(qǐng)求參數(shù)和響應(yīng)結(jié)果

一般會(huì)加個(gè)適配層來統(tǒng)一對(duì)接口的請(qǐng)求參數(shù)和響應(yīng)。適配層在請(qǐng)求里加 token 之類的,在響應(yīng)里處理通用報(bào)錯(cuò)。如:

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

對(duì)具體接口做格式化請(qǐng)求參數(shù)和接口的返回。

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

適配第三方庫(kù)

如果是第三方組件,可以用個(gè)組件代理第三庫(kù)的組件。如:

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

如果是一個(gè)函數(shù),可以用一個(gè)函數(shù)來代理。如:

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

適配全局 API

如果我們大量代碼用了瀏覽器的可能會(huì)被廢棄的實(shí)驗(yàn)性的 API??梢宰鲞@樣的配置:

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

總結(jié)

 

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

 

責(zé)任編輯:武曉燕 來源: 前端GoGoGo
相關(guān)推薦

2009-07-22 07:45:00

Scala代碼重復(fù)

2022-10-20 13:05:53

patches文件生成

2019-09-16 09:05:05

前端開發(fā)技術(shù)

2011-09-19 09:49:48

2018-07-04 13:14:35

2022-06-23 09:00:00

JavaScriptHTML應(yīng)用程序

2018-11-08 15:50:18

前端Javascript重用性

2021-12-16 16:35:46

CSS代碼前端

2023-11-01 10:18:10

自動(dòng)化測(cè)試工具

2014-04-03 10:29:27

iOSAndroid跨界平臺(tái)

2021-11-22 11:30:37

JavaScript代碼瀏覽器

2020-03-06 10:05:59

前端Javascript代碼

2011-08-03 13:04:54

2023-05-15 07:06:36

2021-02-06 14:05:29

代碼語(yǔ)言bug

2011-07-18 09:10:30

Linux 3.0微軟

2015-03-27 18:01:58

云計(jì)算SaaS應(yīng)用渠道沖突

2018-07-13 16:09:03

數(shù)據(jù)中心審計(jì)物理設(shè)備

2024-04-09 13:00:34

數(shù)據(jù)中心

2023-07-05 15:12:20

數(shù)據(jù)中心綜合布線
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 久久久久久久久久久一区二区 | 国产精品久久久久久久久久免费 | 国产精品久久久久久久久久久久久久 | 一区二区日本 | 国产蜜臀 | 欧美网址在线观看 | 精品一区二区三区在线观看国产 | 亚洲久草视频 | 日本免费视频 | 日日天天 | 久久久久中文字幕 | 亚州一区二区三区 | 色秀网站 | 欧美 视频 | 小川阿佐美pgd-606在线 | 91午夜在线| 特黄特色大片免费视频观看 | 超碰在线免费 | 久久久www成人免费无遮挡大片 | 亚洲性人人天天夜夜摸 | 国产蜜臀97一区二区三区 | 日本成人三级电影 | 午夜爽爽爽男女免费观看影院 | 亚洲免费精品 | 欧美h | 亚洲三级视频 | 美国一级片在线观看 | 日本成人午夜影院 | 免费在线性爱视频 | 色综合久 | 国产一级免费视频 | 69性欧美高清影院 | 久久久久久一区 | 久久精品国产亚洲一区二区 | 女同久久另类99精品国产 | 麻豆av在线| 国产成人免费视频网站高清观看视频 | 精彩视频一区二区三区 | 亚洲视频一 | 波多野结衣中文视频 | 久色一区 |