組件模式組件模式是我們用的最多的或者說目前" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網站運營 > WEB的三種設計模式

WEB的三種設計模式

時間:2023-06-02 08:12:02 | 來源:網站運營

時間:2023-06-02 08:12:02 來源:網站運營

WEB的三種設計模式:前端作為軟件工程長期發(fā)展出來的一個獨立分支,一直沒有屬于自己的特定的代碼設計模式,最近我們在實踐中對一些發(fā)源于面向對象的代碼設計做了一些總結。

組件模式

組件模式是我們用的最多的或者說目前大家都唯一能夠理解的模式,組件模式的特點是,予以每個組件獨立的上下文,組件和組件之間有嚴格的代碼隔離,通常在不考慮全局變量的影響下組件之間是完全無潛在交互的。

const Table = createComponent({ name:'table', state:{ data:[], }, view:{ render(){ return( <div>{this.state.data.map(d=>{ return d })}<div> ) } }})const Page = createComponent({ name:'page', view:{ render(){ return( <Table /> ) } }})復制代碼這種模式我們都很熟悉,Page 和 Table 是兩個擁有獨立上下文的組件,在不同的 UI 框架里有不同的組件交互方式,在 React 中,Page 如果要和 Table 進行交互,可以使用 props 傳遞,或者借助 Context 來共享一部分上下文。

但是這種模式在很多場景下并不是完全有效的,只有當我們非常明確兩個組件之間的邊界時,模式和實際情況才是相符合的,例如考慮這樣一種場景

const HeadTitle = ({text})=>{ return( <p>{text}</p> )}const Page = createComponent({ name:'page', state:{ text:'page', }, view:{ render(){ <HeadTtile text={this.state.text}> } }})復制代碼在這個示例中,乍看是沒啥問題,平時我們都會將一些無狀態(tài)的 UI 提取為無狀態(tài)的函數(shù)組件,但經過實踐你會發(fā)現(xiàn)實際上,HeadTitle 大概率僅服務于 Page,也就是說 HeadTitle 并不是為了復用而被提取,更多是因為大型組件的文件需要拆解從而減小體積,降低管理難度。

但是以此為目的進行組件化拆解會破壞原有組件的完整性,導致大量的參數(shù)傳遞,這和我們過度提取代碼到函數(shù)其實是一個效果。

function print(name){ console.log(name)}function main(){ const name = 'main' print(name)}// 如果 print 在 main 函數(shù)內部則不需要再次傳遞 namefunction main(){ const name = 'main' function print(){ console.log(name) } print(name)}// 因此對于 main 來說 print 是一個獨立函數(shù)?,還是一個代碼片段?復制代碼為了解決組件提取導致的上下文隔離問題,我們實踐了一種模式,我們稱之為組合模式

組合模式

和組件模式相比,組合模式是一種輕量化的方案,相比組件模式兩者有明顯的區(qū)別

  1. 組件模式擁有獨立的上下文,組件和組件之間組合成新的組件需要進行上下文的傳遞,而組合模式則只是組件的一個片段,若干個組合體組成了一個完整組件,組合體之間共享上下文,不需要額外傳遞,但組合體本身實現(xiàn)了相關邏輯的內聚
  2. 組件和組件之間因為上下文隔離,因此可以擁有相同的內部成員,組合體只是組件的一個片段,組合體之間不能用相同的內部成員。
  3. 組件有實例,需要命名標識,組合體沒有實例,不需要命名標識
參照以上區(qū)別我們來看看的代碼示例

const table = createCompose({ view:{ renderTable(){ return( <div>{this.state.data.map(d=>{ return d })}<div> ) } }})const head = createCompose({ state:{ text:'page' }, view:{ renderHead(){ return( <p>{text}</p> ) } }})const Page = createComponent(compose({ name:'page', state:{ data:[] }, view:{ render(){ <> {this.view.renderHead()} {this.view.renderTable()} </> } }},[table, head]))復制代碼現(xiàn)在 head 和 table 都成了組合體,通過組合變成了 page 的一部分,為此他們可以共享彼此的上下文,而不用額外通過 props 或者 Context 來傳遞或者共享參數(shù)

除了組合模式,我們還總結了第三種模式,membrane 模式,這種模式我在早期的文章中有提到過,今天我們將其簡化。

Membrane 模式

和組合模式相比,membrane 模式具有一些共通性,例如同樣沒有獨立的上下文,不需要命名標識,不過兩者也有極大的區(qū)別

  1. membrane 是一種抽象模式,和組合模式相比,每個 membrane 只能有一個模板
  2. compose 和 membrane 可以聯(lián)合使用
const pageTemplate = () => { return { state:{ name:'', }, service:{ init(){} }, controller:{ onMount(){ this.service.init() } }, view:{ render(){ return( <div>{this.state.name}</div> ) } } }}const Page1Membrane = createMembrane(pageTemplate(), { name:'page-1-membrane', service:{ init(){ this.setter.name('page-1-membrane') } }})const Page1Membrane = createMembrane(pageTemplate(), { name:'page-1-membrane', service:{ init(){ this.setter.name('page-2-membrane') } }})const Page1 = createComponent(Page1Membrane)// render Page1 name === page-1-membraneconst Page2 = createComponent(Page2Membrane)// render Page2 name === page-2-membrane復制代碼如果你熟悉面向對象設計,那么可能會很快聯(lián)想到 membrane 和 抽象類的特性有些相似,不過相比抽象類,membrane 可以包含具體的實現(xiàn),因此兩者也不完全等價,但是從設計上是有一定的共通性的

在實際實踐中,我們結合上述三種模式,借助類似 mermaid 這樣的 UML 圖形庫,在日常迭代中增加了前端設計相關的內容,從實際結果看我們認為這些模式有助于改善前端設計的粗糙和非專業(yè)性,同時可以改善前端代碼的標準化程度,利用 UML 圖更好的代替注釋和文字文檔來描述業(yè)務代碼的組成關系。

關鍵詞:設計,模式

74
73
25
news

版權所有? 億企邦 1997-2025 保留一切法律許可權利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關閉