精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

簡單說幾句,聊聊如何設計組件?

開發 前端
組件化是客戶端開發最重要的內容,設計一套復用度高、擴展性好的組件系統,可以顯著提高開發效率,并且可以減少后期的維護成本。

[[356515]]

 一、寫在前面

現今的web開發通過前后端分離的技術拆分為了web后端開發與web前端開發,值得指出的是,web前端開發早已不是傳統意義上的開發模式了,轉而變成了web客戶端開發,有過客戶端開發經驗的同學應該知道這兩者間的差別,客戶端開發關注的是:

  1. 應用的生命周期
  2. 組件化
  3. 開發模式與打包方法

組件化是客戶端開發最重要的內容,設計一套復用度高、擴展性好的組件系統,可以顯著提高開發效率,并且可以減少后期的維護成本。

二、一個筆記組件的設計案例


就以我正在使用的筆記app為例,上圖展示的筆記的閱讀與書寫區域,如何將這個區域抽象為一個組件呢?讓我們一步一步來分析。

1. 最簡api

我們為該組件取個名字(取名很重要),就叫Note吧。不管是在閱讀狀態還是在編輯狀態,該組件都要展示筆記的內容,因為筆記對象應該通過組件的接口傳入進來,因為我們為該組件設計第一個api:

屬性說明類型是否必填data筆記對象數據object是

接下來,我們簡單使用一下這個組件:

為了兼容vue與react的讀者,本頁面均使用JSX語法

  1. const note = { 
  2.     title:  如何制作一個組件?.md , 
  3.     content:    

 這樣,一個最簡api的筆記組件就搞定了,它的接口非常簡單,只需要提供一個data屬性,就可以展示出筆記內容,并且可以點擊編輯進入書寫狀態。

一般而言,如果沒有更多的需求的話,我們的筆記組件設計到這里也就可以了。**在設計組件時,務必遵循最小化原則,即盡可能少地拋出接口。**因為使用組件的用戶可能有很多,一旦組件作者不小心拋出了一個不合理的接口,以后想要修改就幾乎不可能了(只能通過標記過時的方法提醒用戶,但這種做法往往是無奈之舉)。

2. 滿足數據獲取的多種情況

現在,組件的使用者已經可以通過很簡潔的api使用這個筆記組件了,但是現在問題來了:有的組件使用者只拿到了筆記的id,想要通過直接傳入id的方式使用組件。

此時,作為組件作者,我們評估了這個需求是合理的,于是,我們擴展了筆記組件的api:

屬性說明類型是否必填默認值data筆記對象object否nulldataId筆記對象idstring否null

現在可以通過傳入id的方式來使用組件了:

  1. const noteId =  123  
  2. <Note dataId={noteId} /> 

  • 請注意,api中的兩個屬性都是非必填的,因為不知道用戶會傳入哪個屬性,為了程序的嚴謹性,組件內部應當校驗兩個參數都不傳的情況,并通過拋出錯誤告訴調用者。

這是組件設計的一個技巧,通過支持多種數據源使得調用更加簡單。但是這種設計也有其弊端所在,如果這種兼容性的擴展過多會使得組件的內部邏輯變得復雜,也會使得api變得難于理解,因此,對于兼容性的api擴展要謹慎,不可過量。

3. 兼容不同模式

組件的使用一如既往的優雅、簡單,但是現在又有用戶提出新的需求了:因為該組件是支持閱讀與編輯兩種模式的,在使用時,對于他人的筆記是不可編輯的,能否在指定的場景下只支持一種閱讀模式?

筆記組件由于內部支持了兩種模式,既支持閱讀,也支持編輯。因此調用者只想使用一種模式也是合理的。于是,我們繼續擴展組件的api:

屬性說明類型是否必填默認值mode模式,數組的第一項作為初始模式,該參數不可為空數組array否[ write , read ]

現在,對于只想使用閱讀模式的用戶,可以這么調用:

  1. const note = {} 
  2. const mode = [ read ] 
  3. <Note data={note} mode={mode} /> 

 在設計api時,我們在滿足需求的前提下,支持了更多情況。首先,使用者也可能只使用編輯模式,因為mode參數是支持隨意組合各種模式的,因此這種情況也能滿足。另外,如果組件以后擴展了更多模式,該api仍然能滿足需求,只需要為mode數組增加更多的模式項即可。這里有一個更佳的設計是,當使用多個模式時,確定哪個模式作為初始模式也是有必要的,因此,將mode數組的第一項作為多模式下的初始模式,既滿足了需求,又達到了api設計最小化的原則。

現在,我們對用戶的需求進行了擴展,不僅支持只使用閱讀模式,還支持各種模式任意組合和初始模式,但是這還不夠,組件的設計者應當針對需求想到更長遠的情況,針對這個例子,我們還可以為組件擴展一個模式改變的事件,讓調用者可以捕捉到筆記組件從閱讀 -> 編輯或編輯 -> 閱讀(隨著模式的擴展,這種組合會更多)切換的時機:

事件說明回調參數modeChange模式切換時觸發(from: string, to: string) from表示切換前的模式,to表示切換后的模式

調用者可能在捕捉到模式切換事件時,做一些特定的工作:

  1. function handleModeChange(fromto) { 
  2.   // ... 
  3. <Note onModeChange={handleModeChange}  /> 

 4. 更多的支持

在編輯器中編輯筆記是html或markdown類型的,筆記組件支持將筆記導出為一個PDF文檔。因此,設計時我們可以將組件的一些能力抽象為api,再次擴展組件的api:

方法說明參數exportPDF導出筆記為PDF文件-toggleFullscreen切換全屏顯示(value: boolean) 是否全屏展示

組件設計時,我們可以將可預見范圍內的組件的能力設計為api,需要注意的,方法的參數與返回值也是api的一部分,應當謹慎設計。

除了擴展組件的能力外,我們還可以擴展組件的視圖。注意到閱讀按鈕右側的工具欄了嗎?我們假設這部分的視圖不屬于筆記組件,是通過api擴展而渲染出來的,這就是組件的子視圖設計,在web前端的組件化中,稱為插槽。我們可以為筆記組件擴展一個工具欄的插槽:

插槽說明參數toolbar工具欄子視圖{ data }

當調用者想要擴展筆記組件的工具欄時,可以這么使用:

  1. const note = {} 
  2. <Note data={note}> 
  3.     <MyToolbar /> 
  4. </Note> 

 這樣,調用者就可以根據自己的需求,在工具欄渲染自己想要的內容了。

三、組件設計四要素

上述案例講述了組件設計的整個流程,通過分析用戶的需求(或未來可能出現的需求),一步一步地設計出了一個復用度高、擴展性好的組件。如果你是一個組件設計的新手,你應該如何去思考、去設計一個優良的組件呢?

1. 先設計,后實現

我們通篇在討論組件的設計,但是實際操作時,很多朋友會通過邊實現邊設計的方式來完成一個組件的制作,這是不合理的,因為自身能力與眼界的限制,實現可能會干擾你的設計,對于以下兩個經典矛盾,希望讀者能選擇后者,以追求合理性為重。

這樣實現比較方便,不如將這個參數拋出讓用戶傳進來吧!

這樣設計比較合理,雖然實現難度可能會比較高,但我可以通過文檔學習、求問他人的方式來實現它,或者直接讓他人來實現。

**提出問題比解決問題更難。**設計難于實現,你應當花70%的時間來設計而不是用來實現。有的設計者甚至不參與實現,設計者與實現者的身份也是隨時在轉換的,善于思考的實現者本身就是設計者。

2. 組件設計四要素

  • 屬性
  • 方法
  • 事件
  • 子視圖(插槽)

上述的案例基本涵蓋了這四個要素,這四要素共同組成了組件的api。需要注意的,除了基本的四要素外,我們還需要注意這些也是組件api的一部分:

  • 屬性的類型、是否必填、默認值(屬性類型確定后不再變化)
  • 方法的參數、返回值(需要考慮變化的情況)
  • 事件回調函數的參數
  • 插槽可獲取到的局部參數

在設計時,應當小心謹慎面對每一個api的要素,哪一個環節出現了設計缺陷,對于調用者都是如鯁在喉。

四、終極思維:面向對象

盡管我們通過一系列的理論講述了組件設計的方法,但是對于初學者而言,仍然難以設計出一個優良的組件,設計一個優良的組件需要大量的經驗,初學者往往考慮不全面,或因對需求的不了解,無法預知未來的變化。

盡管如此,初學者仍然要耐心學習組件的設計,不積跬步無以至千里,經過一段時間的積累,我總結了一個設計組件的終極思維,將面向對象的思想用于組件設計,將會事半功倍。

在開發領域,學會思考比埋頭干活重要。我們將這個理論用于組件設計中,如何通過面向對象的思維來設計一個組件呢?

雖然我們強調使用面向對象的思維來設計組件,但仿佛面向對象思維比組件設計更高深,我們當然不會推薦大家用更加晦澀的理論來指導組件的設計,這里,我們將面向對象擬人化,提取出一個自然世界聯想法的思維方法。

下面我們就用這種方法,來設計一個快遞小哥的組件:

首先,快遞小哥有他的基本信息,這是該組件的屬性,基本信息中包含了他的任職單位、工作年限、姓名、聯系方式等等。此外,快遞小哥有一些特有的行為,例如送快遞、接收包裹等,我們可以將這部分抽取為組件的方法,比如我們調用快遞小哥的接收包裹方法,該方法有兩個參數,第一個參數是我要寄的東西即包裹,第二個參數是快遞單,描述了寄送相關的信息。除了基本信息和一些行為外,快遞小哥組件還有一些特有的事件,當我們的包裹到了時,他會打電話給我們,這里,組件拋出了一個快遞到達的事件,事件的參數是快遞單和包裹,快遞單描述了包裹的送達信息,包裹是快遞單中描述的接收人的東西。最后,快遞小哥組件有沒有子視圖呢?有。快遞小哥組件除了被我們普通用戶調用外,還會被快遞公司所調用,不同的快遞公司會以不同的方式來包裝快遞小哥(例如通過不同服裝不同logo的方式),因此,快遞公司在調用該組件時,會將快遞小哥的服裝傳入一個名為裝束的子視圖中,這樣,不同公司的快遞小哥就有不同的裝束了。

你可以使用自然世界聯想法來思考一切關于面向對象與組件化相關的問題,只要計算機世界仍然是人構建的,我們就仍然可以按照自然世界的規則來感知計算機世界。

二進制世界從來不是冰冷、無情的,每一個二進制串都融入了編碼人的思維模式、價值觀。

五、最后

重新回到開篇的問題,為什么說當今的web前端開發已變成web客戶端開發呢?因為組件化是所有客戶端開發的核心概念,只要這個端大部分的時間在做組件抽象的工作,我們就可以認為自己在從事客戶端開發。

最后,組件化不是銀彈,不能為你解決任何實際問題,它只是一種思維方式。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2011-05-31 14:06:10

Oracle分區

2011-05-30 10:46:40

PHP

2022-02-07 08:27:00

數據庫組件功能

2010-06-18 17:13:07

Linux anacr

2010-06-13 15:10:19

Linux 查看進程

2023-01-03 07:40:27

自定義滑塊組件

2021-03-09 08:01:27

CPUarm64寄存器

2023-11-29 08:26:38

2024-03-19 08:15:09

云原生云計算容器

2009-12-28 17:12:38

Fedora Foru

2010-06-18 10:11:16

Linux Accep

2010-06-21 16:02:35

Linux ar命令

2021-01-22 11:58:30

MySQL數據庫開發

2010-09-17 14:54:29

常用網絡協議

2009-12-24 16:21:04

Fedora core

2009-06-18 12:14:47

javascript 函數

2011-07-18 14:45:26

2021-06-08 09:28:12

.Net通知服務

2022-03-02 07:52:13

React類組件函數式組件

2024-10-06 12:56:36

Golang策略設計模式
點贊
收藏

51CTO技術棧公眾號

久久久999视频| 国产一区二区在线播放| 妖精视频一区二区| 亚洲欧美韩国| 国产精品成人在线观看| 91免费人成网站在线观看18| 国产午夜精品无码一区二区| 你微笑时很美电视剧整集高清不卡| 在线视频一区二区三区| 乱子伦一区二区| 岛国精品资源网站| 日本综合视频| 亚洲午夜一区二区三区| 日韩亚洲视频在线| 黑人精品一区二区三区| 免费看欧美女人艹b| 久久久久久久久中文字幕| 中文字幕第4页| 最新精品在线| 日本韩国一区二区| 国产无限制自拍| 精品国产丝袜高跟鞋| 成人精品一区二区三区中文字幕| 国产精品美乳一区二区免费 | 国产99久久精品一区二区300| 欧美一区二区三区在线观看 | 日韩激情在线视频| 最好看的中文字幕| 国产第一精品| 色屁屁一区二区| 少妇高潮大叫好爽喷水| 91网页在线观看| 久久精品亚洲乱码伦伦中文| 国产日本一区二区三区| 午夜精品一区二区三| 捆绑紧缚一区二区三区视频| 国产成人亚洲精品| 伊人手机在线视频| 99xxxx成人网| 午夜精品福利在线观看| 免费网站观看www在线观| 一区二区三区四区在线观看国产日韩| 一区二区三区精品99久久| 国产精品成人无码专区| 哺乳挤奶一区二区三区免费看 | 国产精品久久久久久久久影视| 久久高清免费视频| 在线 亚洲欧美在线综合一区| 欧美成人精品激情在线观看| 国产精品丝袜一区二区| 第九色区aⅴ天堂久久香| 国产亚洲精品高潮| www.黄色在线| 国产一区二区三区91| 亚洲精品视频免费| 欧美成人午夜精品免费| 要久久爱电视剧全集完整观看| 日韩电影在线观看中文字幕| 国产精品久久久免费观看| 红杏成人性视频免费看| 亚洲精品国产suv| 三级电影在线看| 精品一区毛片| 在线视频欧美性高潮| 特黄一区二区三区| 亚洲色图88| 久久久久久久久亚洲| 国产女同在线观看| 美女网站久久| 国产男女猛烈无遮挡91| 国产精品毛片一区视频播| 国产一区二区不卡在线| 99在线视频首页| 亚洲日本在线播放| 欧美经典一区二区| 青青视频免费在线| 黄色激情在线播放| 欧美午夜一区二区三区免费大片| 一个色综合久久| 日本免费精品| 亚洲精品国产精品国自产在线| 亚洲黄色在线网站| 四季av一区二区凹凸精品| 欧美成人四级hd版| 久久黄色精品视频| 男女激情视频一区| 99re国产视频| 韩国三级在线观看久| 亚洲少妇最新在线视频| 欧美亚洲精品一区二区| 啪啪av大全导航福利综合导航| 日韩欧美国产电影| 美女被到爽高潮视频| 欧美国产三级| 国产精品扒开腿做爽爽爽视频 | 国产精品乡下勾搭老头1| 国产伦精品一区二区三区照片91 | 亚洲丁香日韩| 精品国产视频在线| 国产福利拍拍拍| 久久91精品国产91久久小草| 精品一区2区三区| 在线免费av网站| 午夜国产不卡在线观看视频| 九九热免费在线观看| 欧美一区二区三区红桃小说| www日韩欧美| 亚洲欧美自拍视频| 国产91在线看| 亚洲自拍的二区三区| 九色porny丨国产首页在线| 欧美片网站yy| 加勒比综合在线| 亚洲午夜极品| 91日本在线视频| eeuss影院www在线播放| 黄网站色欧美视频| av地址在线观看| 欧美xxxx中国| 国产aaa精品| 四虎影视在线播放| 夜夜精品视频一区二区| 天天操狠狠操夜夜操| 国产精品一在线观看| 久久久噜噜噜久久中文字免| 国产精品久久久久久69| 国产欧美精品一区| 蜜臀av午夜一区二区三区| 第一区第二区在线| 欧美理论电影在线播放| 国产精品九九九九| 国产精品久久久久久妇女6080| 国产成人精品无码播放| 亚洲涩涩av| 欧美亚洲成人网| 少妇一区二区三区四区| 亚洲综合丝袜美腿| 色黄视频免费看| 亚洲久久久久| 成人午夜一级二级三级| 在线观看完整版免费| 在线日韩av片| 亚洲第一视频区| 视频一区视频二区在线观看| 欧美高清一区二区| 欧美日韩视频网站| 亚洲欧美一区二区激情| 无码人妻精品一区二区50| 26uuu亚洲综合色欧美| www精品久久| 欧美午夜寂寞| 国产成人精品日本亚洲专区61| 男人天堂资源在线| 在线观看区一区二| 后入内射无码人妻一区| 狠狠色狠狠色合久久伊人| 久久精品国产精品亚洲精品色| 亚洲精品一区av| 欧美尺度大的性做爰视频| 成 人 免费 黄 色| 亚洲成av人片在线观看| 风间由美一二三区av片| 视频一区国产视频| 亚洲精品在线视频观看| 国产精品亚洲一区二区在线观看 | 无人区在线高清完整免费版 一区二 | 午夜精品久久久久久久久| 最新不卡av在线| 亚洲一区二区四区蜜桃| 欧美一区二区三区人| 日韩av影院在线观看| 国产av熟女一区二区三区 | 国产精品第8页| avtt亚洲| 日韩欧美不卡在线观看视频| 久久精品视频9| 久久亚洲私人国产精品va媚药| 91看片就是不一样| 日韩毛片视频| 国产69精品久久久久9999apgf| 678在线观看视频| 亚洲色图国产精品| 国产女人18毛片18精品| 亚洲电影一区二区三区| 国产ts在线播放| 韩国av一区二区三区四区| 男人天堂a在线| 国内亚洲精品| 亚洲自拍偷拍区| 91精品论坛| 亚洲裸色大胆大尺寸艺术写真| 欧美精品一区二区高清在线观看| 日韩手机在线观看| 中文字幕国产一区| 性生交大片免费看l| 免费在线欧美黄色| 麻豆md0077饥渴少妇| 欧美亚洲色图校园春色| 国产中文欧美精品| 综合另类专区| 欧美成人激情在线| 成年人视频在线看| 精品日韩在线观看| 在线免费看91| 精品国产91久久久| 亚洲 欧美 变态 另类 综合| 97se狠狠狠综合亚洲狠狠| 999久久久精品视频| 亚洲一区二区三区高清| 中文字幕第50页| 国产成人精品三级高清久久91| 91精品天堂| 欧美黄色三级| 69影院欧美专区视频| 久久久久久久久免费视频| 日韩毛片在线看| 超碰在线观看99| 欧美日韩成人综合| 69国产精品视频免费观看| 一区二区三区中文在线| 国产欧美小视频| 91麻豆国产自产在线观看| 不卡的一区二区| 久久电影网站中文字幕| 国产一区视频在线播放| 国产麻豆剧传媒精品国产| 亚洲国产日本| 大地资源网在线观看免费官网| 青青草国产免费一区二区下载| 狠狠干一区二区| 日韩一级淫片| 亚洲精品免费一区二区三区| 国产福利一区二区三区在线播放| 欧美诱惑福利视频| 成人免费网站观看| 欧美国产日韩一区| h网站久久久| 久久精品中文字幕一区| 8888四色奇米在线观看| 国产一区二区三区在线看| 欧洲天堂在线观看| 日韩av在线一区二区| 少妇喷水在线观看| 日韩国产精品一区| 午夜在线观看视频18| 精品成人一区二区三区| 高清乱码毛片入口| 精品国产麻豆免费人成网站| 狠狠躁夜夜躁av无码中文幕| 欧美成人一区二区三区片免费 | 欧美人与物videos另类| 欧美绝顶高潮抽搐喷水合集| 国产欧美丝袜| 欧美大片网址| 免费观看成人在线| 亚洲另类av| 午夜欧美性电影| 国产精品99在线观看| 中文字幕色一区二区| 亚洲国产日韩欧美在线| 国产在线无码精品| 亚洲精品乱码| 乱子伦视频在线看| 日本不卡在线视频| 色呦色呦色精品| 国产精品一区二区你懂的| 91丝袜超薄交口足| 顶级嫩模精品视频在线看| 最新版天堂资源在线| 91女人视频在线观看| 欧美18—19性高清hd4k| 国产精品欧美一级免费| aa视频在线播放| 99热在线精品观看| 激情内射人妻1区2区3区| 美女久久久精品| 人妻少妇偷人精品久久久任期| 成人听书哪个软件好| 91欧美一区二区三区| 日本在线播放一二三区| 色综合久久悠悠| 天堂中文在线播放| 亚洲黑丝一区二区| 日韩欧美第二区在线观看| 日韩理论电影院| 97在线国产视频| 久久精品日韩欧美| av噜噜在线观看| 成人免费视频caoporn| 日韩乱码人妻无码中文字幕久久| 国产精品国产三级国产普通话99 | 4438x全国最大成人| 91一区一区三区| 手机在线中文字幕| 天天影视色香欲综合网老头| 伊人久久国产精品| 亚洲高清久久久久久| 日本在线视频站| 97国产成人精品视频| 亚洲男女网站| 欧美国产一二三区| 一本精品一区二区三区| 激情六月丁香婷婷| 夜间精品视频| 精品视频一区二区在线| 国产麻豆视频一区二区| mm131美女视频| 一区二区三区免费| 在线观看色网站| 亚洲美女中文字幕| 日本一本在线免费福利| 国产精品自拍网| 亚洲自拍电影| 激情五月宗合网| 国产精品亚洲人在线观看| 欧美极品jizzhd欧美18| 色综合中文综合网| 久久久久亚洲av成人毛片韩| 欧美精三区欧美精三区| 欧美欧美欧美| 97精品国产97久久久久久免费| 高清久久精品| 婷婷精品国产一区二区三区日韩 | 一区二区在线免费| 中文字幕乱码中文字幕| 亚洲精品资源在线| bl视频在线免费观看| 91精品国产91久久久久青草| 97久久夜色精品国产| 亚洲无吗一区二区三区| 久久久久久一级片| 日本一级一片免费视频| 亚洲а∨天堂久久精品喷水| 中文字幕伦理免费在线视频| 成人精品一区二区三区电影免费 | 在线视频精品免费| 亚洲女成人图区| 伊人久久精品一区二区三区| 精品一区二区不卡| 国产精品亚洲综合久久| 亚洲一区二区三区四区五区六区| 亚洲一区二区偷拍精品| 亚洲精品福利网站| 九九精品在线视频| 欧美日韩国产一区二区在线观看| 欧美xxxx吸乳| 国产剧情一区二区三区| 欧美日韩综合一区二区| 欧美一级淫片007| 日韩特级毛片| 国产精品久久久久久久久久直播| 午夜精品视频一区二区三区在线看| 91女神在线观看| 国产精品久久久爽爽爽麻豆色哟哟| 中文av免费观看| 中文字幕不卡av| 亚洲福利影视| 三上悠亚免费在线观看| 成人午夜av在线| 日韩欧美不卡视频| 亚洲免费视频在线观看| 久久久人成影片一区二区三区在哪下载| 欧美日韩在线观看一区二区三区| 噜噜噜91成人网| 91成人在线免费视频| 欧美日韩国产综合一区二区三区 | 亚洲91精品在线观看| 色婷婷精品视频| 黄色免费网址大全| 亚洲视频综合在线| 内射后入在线观看一区| …久久精品99久久香蕉国产| 九一成人免费视频| 手机免费av片| 亚洲午夜国产一区99re久久| 色视频精品视频在线观看| 国产精品视频色| 欧美国产免费| 小早川怜子久久精品中文字幕| 欧美人与禽zozo性伦| 538在线观看| 亚洲精品欧洲精品| 国产成人午夜片在线观看高清观看| 日韩特黄一级片| 视频在线观看99| 99久久婷婷国产综合精品青牛牛 | 亚洲美腿欧美激情另类| 亚洲国产综合在线观看| 蜜臀av色欲a片无码精品一区| 久久久久国产精品麻豆ai换脸| 国产又粗又猛又爽又黄的视频一 | 97欧美成人| 日本香蕉视频在线观看| 国产午夜亚洲精品羞羞网站| 国产精品羞羞答答在线| 2019中文字幕在线免费观看| 第一会所sis001亚洲| 又黄又爽的网站| 欧美一区欧美二区| 欧美1级2级|