vue 組件設計

前言

對於component到底需要設計到多小,沒有一定的標準,根據開發情境決定。

component設計:

可以分成設計面跟程式面,其實兩個是差不多的規則。

設計面可以參考原子設計裡面的5個部分: 原子,分子,組織,模板,頁面。

原子: UI的最小單位。一個button、一個input或少數div組成的文字框,可以在整個網頁不斷覆用。

分子: 少數原子組合起來,例如表單裡面的label + input。

組織: 由分子和原子組合起來,例如一個form或是一個card。

模板: 由以上分子和原子和組織組合起來,一個頁面的版型。

頁面: 這裡的頁面不同於模板,而是實際套用資料的結果頁面,例如: 一個產品模板會給很多的產品資料套用,不同的產品資料套用到同一個模板,就是不同的頁面。

程式面從一個組件該做什麼事,如何覆用和組件分類為主要參考。

vue組件分類:

vue 組件分成幾類:

  • page 組件
  • 一般可覆用組件
  • 最小單位組件
  • 業務組件
page 組件放在 view資料夾內,每一個在router引用的view組件都是一個page,沒有覆用可能,用來協調業務組件,類似controller。

一般可覆用組件放在components資料夾內,由最小單元組件組成,通常只為了一個目標,為了增
加覆用性,提供可以配置的參數,在可覆用組件內沒有會造成副作用的功能,如call 第三方api,有的話也是通過把網址傳入達到不同的效果,跟function一樣只接收參數跟返回參數。

最小單位組件: 組件的設計就是要盡量小,然後自底而上建構複雜的組件,最小單位組件就是原子組件,通常提供默認樣式、功能和配置樣式、功能。

業務組件通常比較難覆用(除非剛好有一樣的操作邏輯),因為可能包含特定的業務邏輯和從第三方取得資料(call api)的操作,拉出組件的目的主要是為了減少和優化在page組件上的程式碼,不然都塞在page組件也是可以運作。

現有組件庫 element ui:

現在的組件庫都會強調不用寫css,他們也包含了最小單位組件跟可覆用組件。
這邊只討論組件,不討論layout或是一些內建的排版class。

最小單位組件

以input來看
<el-input v-model="input" placeholder="请输入内容"></el-input>
配置有
v-model綁數據
是否禁用
長度
類型(是否為textarea)
和綁事件

以日期選擇器來看
<el-date-picker
      v-model="value1"
      type="date"
      placeholder="选择日期">
    </el-date-picker>
配置有
v-model綁數據
是否可以編輯
是否可以清除
日期範圍
default值
綁事件

以分頁選擇器來看
<el-pagination
    layout="prev, pager, next"
    :total="50">
  </el-pagination>
配置有
v-bind綁數據 total、page-count、page-size
按鈕背景色
組件布局
上下頁文字
綁事件

這些組件的共通點就是開始的tag跟結束的tag中間不會放東西,輸入項的組件會用v-model讀取數據,用v-bind當作配置項目。

可覆用組件
<el-tooltip class="item" effect="dark" content="Top Left 提示文字" placement="top-start">
      <el-button>上左</el-button>
 </el-tooltip>

<el-card class="box-card">
  <div slot="header" class="clearfix">
    <span>卡片名称</span>
    <el-button style="float: right; padding: 3px 0" type="text">操作按钮</el-button>
  </div>
  <div v-for="o in 4" :key="o" class="text item">
    {{'列表内容 ' + o }}
  </div>
</el-card>

把template包在tag之間,裡面就會有最小單元組件。

業務組件

通常包含websocket、firebase、第三方api、vuex的操作。

最小單位組件只設定配置項目,可覆用組件只傳入數據或是template,業務組件包含業務邏輯,例如blog資料的新增修改刪除,todo list在同一頁做新增修改刪除,或是需要跟複雜的套件互動。

最小單位組件強調統一的樣式跟少數的配置彈性,可覆用組件強調只要可以傳入正確的資料就能獨立運作,不會受store或是api影響,其他複雜的邏輯應該都放在業務組件上,不過這樣的業務組件將會變得非常的龐大。

程式面

vue組件該怎麼設計,可以從程式面來看,好的設計應該是單一職責,關注分離,分層,不重複且好維護,vue的組件終究是在處理view相關的問題,所以如果跟view無關的邏輯應該是抽到其他的js檔,例如引入了three.js套件,處理3D物件移動時,如果將程式碼塞到某一個component裡,程式碼行數多起來將會難以維護,應該要將three的程式碼抽出來到單獨的一個js或資料夾,在component只引用必要的function和data,就可以將業務組件減重。

業務組件相當於一個service,可以將自己的工作委託給其他的service(js檔),讓自己只專注於跟view相關資料的變化

最小單位組件跟可覆用組件應該是要無副作用的,少數情況組件會跟store一起用,尤其是單例的組件,例如Loading用一個store的變數控制show或是hide,不會因為api或store改變執行結果,一樣的資料每次執行結果都應該要一致。

page組件相當於controller,只是協調各個組件的溝通,行數應該要少。

留言

這個網誌中的熱門文章

WINDOWS cmd 操作:查看進程、TCP連線、刪除TCP連線和進程

mongodb aggregate 筆記

mongodb shell 操作