Tab 為實務上常見 UI,可完全使用 Tailwind CSS 實現。
Version
Tailwind CSS 2.2.0
Tab
上方選擇不同的 tab,下方的 content 會隨之改變。
<template>
<div class="border-b border-gray-200">
<nav class="-mb-px flex space-x-8" aria-label="Tabs">
<a v-for="tab in tabs" :key="tab.name" class="cursor-pointer" @click="onClick (tab)" :class="[tab.current ? 'border-indigo-500 text-indigo-600' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300', 'whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm']">
{{ tab.name }}
</a>
</nav>
</div>
<div v-if="selectedTab === 'iPhone'">
iPhone
</div>
<div v-if="selectedTab === 'iPad'">
iPad
</div>
<div v-if="selectedTab === 'Macbook'">
Macbook
</div>
</template>
<script setup>
let selectedTab = $ref ('iPhone')
let tabs = $ref ([
{ name: 'iPhone', current: true },
{ name: 'iPad', current: false },
{ name: 'Macbook', current: false },
])
let onClick = x => {
tabs.forEach (x => x.current = false)
x.current = true
selectedTab = x.name
}
</script>
第 2 行
<div class="border-b border-gray-200">
建立 tab 與 content 之間的隔線。
第 3 行
<nav class="-mb-px flex space-x-8" aria-label="Tabs">
將所有 <a>
包在 <nav>
內。
第 4 行
<a v-for="tab in tabs" :key="tab.name" class="cursor-pointer" @click="onClick (tab)" :class="[tab.current ? 'border-indigo-500 text-indigo-600' : 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300', 'whitespace-nowrap py-4 px-1 border-b-2 font-medium text-sm']">
{{ tab.name }}
</a>
根據資料顯示所有 tab,並設定 tab 的視覺 style。
第 9 行
<div v-if="selectedTab === 'iPhone'">
iPhone
</div>
建立每個 tab 所顯示 content。
23 行
let tabs = $ref ([
{ name: 'iPhone', current: true },
{ name: 'iPad', current: false },
{ name: 'Macbook', current: false },
])
建立所有 tab 所綁定的資料。
21 行
let selectedTab = $ref ('iPhone')
儲存目前所選擇的 tab 名稱。
29 行
let onClick = x => {
tabs.forEach (x => x.current = false)
x.current = true
selectedTab = x.name
}
處理 user 選擇 tab 後所發出 event:
- 將
tabs
所有current
重置為false
- 將目前
current
設定為true
- 將目前 tab 的
name
儲存到selectedTab
state
Conclusion
- Tab 看似很複雜 UI,但事實上可很簡單使用 Tailwind CSS 實現