構建可重用且具備自定義擴充套件的 Tab 元件。
概述:Vue.js 具備一個 Slots
功能,它以當前的 Web Components 規範草案為藍本。如果在元件中使用插槽,那麼我們可以在這些插槽部分中填充我們想要的任何內容。這樣,元件可以專注於處理邏輯部分,讓元件的使用者來自行構建檢視部分。
最終效果
我們有一個視窗,其中有四個標籤顯示的對應 label。單擊 label 可顯示關聯檢視部分。
插槽在這裡起什麼作用呢?
到目前為止,已經有很多 Tabs 元件的實現,而且大多數缺少的是可定製性。實現可能會採用這樣的選項卡內容列表。
在這裡,每個選項卡傳遞字串,並且樣式是固定的,滿足不了插入圖片或者其它內容的需求。
另一個缺點是,在使用該 Tabs 元件時,template 需要顯示的資料 data
與指令碼耦合在一起。而我們想要的是顯示的內容應保留在模板部分中,指令碼部分應僅包含邏輯。
那麼我們如何允許該傳遞 Vue 元件而不是字串?這樣 Tabs 元件可以包含我們想要的任何內容,並且呈現它。
這是Vue.js插槽的用武之地。Vue.js元件可以具有多個命名的插槽,當我們使用該元件時,我們可以告訴每個插槽應該放置什麼標記,同時插槽可以包含字串, HTML 標籤或其他 Vue 元件。
使用插槽實現選項卡元件
元件的基本結構如下圖
也就是主要將 Tabs 元件拆分為兩個部分
Tab 元件用於管理當前的標籤頁的 label 以及相關檢視的展示;
Tabs 元件則是用於管理它內部所有的 Tab 元件,對應生成標籤頁以及確定檢視區域。
基於這個結構,構建程式碼,首先確定 Tabs 元件與 Tab 元件的通訊方式。利用 provide
以及 inject
將 Tabs 元件注入到 Tab 中。
Tab 元件:
主要完成以下幾個任務:
slot
:在模板中,利用slot
允許使用者自行插入相關的內容;created
:在 Tab 元件建立的時候,訪問 Tabs 元件,將其push
到childrens
陣列中,進行統一管理;isOpen
:匹配 Tabs 元件的activeId
,判斷展示的是否是當前 Tab 元件;destroyed
:若 Tab 元件登出時,則從childrens
中將其刪除。主要目的在於,如果 Tab 元件是利用v-for
指令生成的,則資料變動時,整體Tabs元件也應該發生變化。
Tabs 元件
Tabs元件的childrens
中包含所有的子Tab元件,利用它來構建選項卡
當 Tab 元件 created
時候,會修改 childrens
,其中存在所有 Tab 元件。利用這些資料先生成標籤頁的 label 。
同時利用 slot
設定 Tabs 元件的檢視區域,並建立一個狀態用於標識當前活躍的 Tab 的activeId
封裝
進一步將其封裝成Vue的元件,配置其model
,以及相關處理,當value
發生變化時,將其賦值給activeId
,相關Tab會自動更新。
例項地址:Tabs 例項
程式碼地址:Github UI-Library
往期文章:
- 從零實現Vue的元件庫(零)- 基本結構以及構建工具
- 從零實現Vue的元件庫(一)- Toast 實現
- 從零實現Vue的元件庫(二)- Slider 實現
- 從零實現Vue的元件庫(三)- Tabs 實現
- 從零實現Vue的元件庫(四)- File-Reader 實現
- 從零實現Vue的元件庫(五)- Breadcrumb 實現
- 從零實現Vue的元件庫(六)- Hover-Tip 實現
- 從零實現Vue的元件庫(七)- Message-Box 實現
- 從零實現Vue的元件庫(八)- Input 實現
- 從零實現Vue的元件庫(九)- InputNumber 實現
- 從零實現Vue的元件庫(十)- Select 實現
- 從零實現Vue的元件庫(十一)- Date-picker 實現
- 從零實現Vue的元件庫(十二)- Table 實現
- 從零實現Vue的元件庫(十三)- Pagination 實現
- 從零實現Vue的元件庫(十四)- RadioGroup 實現
- 從零實現Vue的元件庫(十五)- CheckboxGroup 實現
原創宣告: 該文章為原創文章,轉載請註明出處。