您現在的位置是:首頁 > 網路遊戲首頁網路遊戲

尤大都推薦的元件庫是如何開發出來的?

簡介style 則是為此元件傳入所需的 CSS Variables,即 CSS變數,而在 setup 函式時,會透過 useTheme (後續會談到)鉤子去掛載 Button 相關的樣式,這些樣式中大量使用 CSS Variables 來自定義

3d元素庫怎麼加韌體

「來源: |Vue中文社群 ID:vue_fe」

注意:為了讓篇幅儘可能簡潔一丟丟,在有些地方貼原始碼時,我儘可能貼最能反映要講解內容的原始碼,其他重複性的程式碼就略去了,所以如果你自己嘗試去閱讀原始碼時,可能會發現和文章裡的程式碼有出入。文章跑通 Naive UI 所用到的原始碼倉庫為:https://github。com/pftom/naive-app[1]

簡潔的抽象

前端開發者現在幾乎已經離不開 UI 元件庫了,典型的如 Ant Design、Material Design、以及最近 Vue 生態興起的 Naive UI 等,元件庫提供了簡單、靈活、易用的使用形式,如一個頁面中最常見的 Button 的使用如下:

上述幾行簡單的程式碼就可以完成如下有意思的效果:

尤大都推薦的元件庫是如何開發出來的?

甚至是,可以一鍵切換面板,如 Dark Mode:

尤大都推薦的元件庫是如何開發出來的?

當然還可以處理事件、新增 Icon、處理 Loading 等,透過簡單給定一些 Props,我們就可以擁有一個好看、實用的 Button,相比原始的 HTML 標籤來說,實在是不可同日而語。。。

尤大都推薦的元件庫是如何開發出來的?

冰山理論

尤大都推薦的元件庫是如何開發出來的?

元件庫在帶來靈活、方便的同時,其內部的原理卻並非如它使用般簡單,就像上述的冰山圖一樣引人深思。

讓我們翻一翻最近的 Vue 元件庫新秀 Naive UI 的 CHANGELOG,就可以窺見編寫一個入門的元件庫大致需要多少時間:

尤大都推薦的元件庫是如何開發出來的?

可以看到,2020-03-21 就釋出了 1。x 版本,而在 1。x 之前又是漫長的思考、設計與開發,至今應該差不多兩年有餘。

而為了跑通一個 Naive UI 的 Button,大致需要如下的檔案或程式碼:

|_____utils

| |____color

| | |____index。js

| |____vue

| | |____index。js

| | |____flatten。js

| | |____call。js

| | |____get-slot。js

| |____index。js

| |____naive

| | |____warn。js

| | |____index。js

| |____cssr

| | |____create-key。js

| | |____index。js

|_____internal

| |____loading

| | |____index。js

| | |____src

| | | |____Loading。jsx

| | | |____styles

| | | | |____index。cssr。js

| |____index。js

| |____icon-switch-transition

| | |____index。js

| | |____src

| | | |____IconSwitchTransition。jsx

| |____fade-in-expand-transition

| | |____index。js

| | |____src

| | | |____FadeInExpandTransition。jsx

| |____wave

| | |____index。js

| | |____src

| | | |____Wave。jsx

| | | |____styles

| | | | |____index。cssr。js

| |____icon

| | |____index。js

| | |____src

| | | |____Icon。jsx

| | | |____styles

| | | | |____index。cssr。js

|_____styles

| |____common

| | |_____common。js

| | |____light。js

| | |____index。js

| |____transitions

| | |____fade-in-width-expand。cssr。js

| | |____icon-switch。cssr。js

| |____global

| | |____index。cssr。js

|____config-provider

| |____src

| | |____ConfigProvider。js

|____button

| |____styles

| | |_____common。js

| | |____light。js

| | |____index。js

| |____src

| | |____Button。jsx

| | |____styles

| | | |____button。cssr。js

|____assets

| |____logo。png

|_____mixins

| |____use-style。js

| |____use-theme。js

| |____index。js

| |____use-form-item。js

| |____use-config。js

看似困難的背後

雖然跑通一個看似簡單的

),

}}

) : null,

}}

// 第三部分

{$slots。default && this。iconPlacement === “left” ? (

{children}

) : null}

// 第五部分

{!this。text ? (

) : null}

// 第六部分

{this。showBorder ? (

aria-hidden

class={`${mergedClsPrefix}-button__border`}

style={this。customColorCssVars}

/>

) : null}

// 第六部分

{this。showBorder ? (

aria-hidden

class={`${mergedClsPrefix}-button__state-border`}

style={this。customColorCssVars}

/>

) : null}

}

});

可以看到,上述的主要展示出了

Top