seansie's blog

#3 元件系統 30天學會 vue系列文 | seansie blog

何謂元件 抽象的超能力

常常有人覺得抽象不好,覺得抽象=難,例如像是數學題目很抽象,其實這是天大的誤解,抽象實質上是讓事物變簡單,因為他用虛擬的簡單概念隱藏了真實的複雜性。

舉例來說,你現在正在閱讀這篇文章,你肯定感覺上網瀏覽網頁不難吧。

這就是得意於瀏覽器,作業系統,還有網路協定幫你提供的抽象使用者見面(就是你眼前看到的UI 按鈕 選單),幫你隱藏了非常晦澀難懂的細節。

反而只專心在重點,像是你想要去哪個網站,而不在乎不重要且瑣碎的細節,例如怎麼傳送 http請求啦,js程式碼怎麼解析啦 ,怎麼用gpu做硬體加速之類的,非專業人士基本上聽不懂的細節,這些都是由抽象介面自動完成的

有句英文諺語叫做 天才熱愛簡潔,白癡熱愛複雜 (**A genius admires simplicity, an idiot admires complexity),**很好的點出了抽象的好處。

同理,vuejs的元件就是抽象網頁元素的一種方式,他隱藏了裡面的複雜性,只專心在重點上。

vuejs中的元件

大家在網頁設計的時候,處理成千上萬的標籤,常常會迷失自我,搞到不知道在幹嘛,這個時候就應該問自己 重點在哪裡?

舉例來說,選單的重點是甚麼,不就是裡面的選項嗎?

其他樣式每個選項都一樣吧,顯然不是重點,這個可以透過抽象介面來把它隱藏起來。

題外話,這樣的好處還有如果想要修該按鈕樣式的時候,只要對抽象介面修改一次就好,省時省力,如果不用恐怕要逐項修改,不僅繁雜還易錯。

而vuejs的抽象介面就是 元件 可以把一些負責相同功能的標籤樣式js,封裝成一個元件(黑箱子),然後僅留下幾個跟外部互動的介面,用來處理重點的事情。

而元件使用方法就是 <元件名 屬性1=? 屬性2=? ... 屬性n=?> <元件名/>

如果沒有使用這層元件抽象,光是實現一個簡單的選單,恐怕要處理成千上萬的標籤了。

不過有了元件只要輸入以元件名為名的標籤,就可以使用由眾多標籤組成的功能了。

對了,你有看到上面有屬性嗎,這是vue元件常用的 介面, 也就是前文所提到的重點事物的互動窗口。

舉例來說,像選單的重點就是裡面的選項對吧,那我透過這個傳入兩個陣列 一個是選項名稱,另一個是選項名稱對應的網址,那這個元件標籤可以這樣寫

<選單 :名稱=namArr :網址=URLarr></選單>

注: 如果要綁定 data() 中的資料需要在屬性前面加上 :

這個在 vuejs 中有專有名詞, 叫做prop ,直譯為屬性,不過本文通常會叫他的英文避免混淆。

這個之後會介紹

元件使用介紹

剛剛在第二章已經介紹了 .vue 的SCF(單一元件檔案)了,那我就透過這些基礎來示範吧。

vue元件其實大致上有兩種類別

  • 主元件 : 是要被掛載在 div標籤上的元件,是裡面最大的元件,存在項目資料夾的src目錄之下,有點像是老闆。
  • 其他元件 : 是要被主元件或其他元件使用的元件,存在項目 /src/components 目錄之下,有點像是員工。

那怎麼使用呢?

要使用元件,必須在元件的使用者(也是元件,可以類比成程式語言的語言的函數呼叫函數)中的元件邏輯中註冊,註冊方法如下,在該元件 .vue 檔案中的 script 標籤中新增

import myComp from './components/myComp.vue
export default{
	components:{
	    myComp // 將 myComp 註冊為元建,名稱可自訂,但建議與 import 的變數名稱相同

	}
}

注意!!

元件名稱不能跟html的所內建標籤名稱相同,例如不能把元件命名成 <p> <article> 這種 HTML已經有的標籤名稱,不然會有不可預期的錯誤。

然後因為”被使用”跟”使用別人”這兩個詞彙真的很拗口且容易讓人誤會,因此筆者不會使用者種方式來敘述而是會用 “母元件” 跟 “子元件” 來稱呼,而母元件使用子元件((母元件使用子元件,即子元件被包含在母元件中,如同員工到公司任職)。

母元件程式碼

// 母元件程式碼
<template>
	<childComp> slot </childComp>
</template>

這樣經過 vuejs 處理過後,就會變成

<template>
	<childComp> 
		子元件的模板(template)內容 中略
	</childComp>

馬上就恢復原狀了,子元件內的內容完好如初! 這樣比直接複製貼上更有效率了!!

樹狀元件概念

對於 VUEJS 的元件系統,也可以把他理解程樹狀的,最上面當然是主元件,是必須透過 main.js 掛載到 div#id 上面的,而子元件間接的透過子元件標籤掛在母元件上,所以子元件不需要掛載,已經透過母元件一次達成了。

也就像一家公司,只要老闆帶頭上市一次就好,不用每個員工都去上市。

而通常網頁的元件系統會長成這樣。

app
	nav(導航)
		menu(主選單)
		search(搜尋)
		notification(通知)
		account(帳號)
	article (文章)
		post(推文)
			image(圖片)
			react(回應)
				like(讚)
				comment(留言)
				share(分享)
			comment-list(留言清單)
				comment-single-recursive(遞迴版單一留言,因為留言是樹狀的) 
			loader(讀取圖示)
	side (側邊欄)
		tools(工具欄)
	footer (註腳)
	

其中縮排的意思代表母元件根子元件的從屬關係

母元件
	子元件

元件資料流

稍微起後一下,元件資料流的概念在 vuejs 中是非常重要的,也就是資料流向是有指定的,不可以亂流,因為這個可以降低軟體的複雜度。舉例來說,馬路上因為有紅綠燈管理車流方向才不會造成亂象,同理,元件間的通訊也要有標準,才不會發生混亂,之後會於 propemit 等等觀念重新提及。