詳解vue2.0 使用動態(tài)組件實現(xiàn) Tab 標簽頁切換效果(vue-cli)
在 vue 中,實現(xiàn) Tab 切換主要有三種方式:使用動態(tài)組件,使用 vue-router 路由,使用第三方插件。
因為這次完成的功能只是簡單切換組件,再則覺得使用路由切換需要改變地址略微麻煩,所以使用的是動態(tài)組件實現(xiàn),如果是在大型應用上,可能使用 vue-router 會方便一些。
先看下最終實現(xiàn)的效果,結構比較簡單,頂部的三個 Tab 標簽用于切換,內(nèi)容區(qū)域分別為三個子組件。

效果預覽
關鍵代碼及分析如下:
<template>
// 每一個 tab 綁定了一個點擊事件,傳入的參數(shù)對應著 tab 下的組件名
<div class="tabs">
<div class="tab" @click="toggleTab('prince')"><a>小王子</a></div>
<div class="tab" @click="toggleTab('rose')"><a>小玫瑰</a></div>
<div class="tab" @click="toggleTab('fox')"><a>小狐貍</a></div>
</div>
// 子組件,顯示不同的 tab
// is 特性動態(tài)綁定子組件
// keep-alive 將切換出去的組件保留在內(nèi)存中
<prince :is="currentTab" keep-alive></prince>
</template>
<script>
// 引入子組件
import prince from './components/prince';
import rose from './components/rose';
import fox from './components/fox';
export default {
name: 'app',
data () {
return {
currentTab: 'prince' // currentTab 用于標識當前觸發(fā)的子組件
};
},
components: { // 聲明子組件
prince,
rose,
fox
},
methods: {
toggleTab: function(tab) {
this.currentTab = tab; // tab 為當前觸發(fā)標簽頁的組件名
}
}
}
</script>
使用動態(tài)組件實現(xiàn) Tab 標簽頁切換的基本過程可以概括為:
- 在父組件中定義一個主 tab 標簽頁,用于切換,同時為每個 tab 綁定點擊事件,傳入該 tab 的子組件名,最后引入并定義子組件
- 子組件中是各 tab 標簽頁的內(nèi)容
- 使用 is 特性動態(tài)切換子組件,使用 kee-alive 緩存
is 特性一般用于原生 HTML 元素擴展
舉個栗子,一般在 ul 標簽中只能嵌套 li 標簽,但是我們現(xiàn)在想在 ul 標簽內(nèi)使用自定義組件 v-li。
<ul> <v-li></v-li> </ul>
而這樣寫肯定是不行的,這就需要用到 is 特性了。
<ul> <li is="v-li"></li> </ul>
這也就是為什么利用 is 特性可以實現(xiàn)動態(tài)切換組件的效果。
keep-alive 指令可以將切換出去的組件保留在內(nèi)存中,可以保留它的狀態(tài)或避免重新渲染。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
如何在Vue單頁面中進行業(yè)務數(shù)據(jù)的上報
為什么要在標題里加上一個業(yè)務數(shù)據(jù)的上報呢,因為在咱們前端項目中,可上報的數(shù)據(jù)維度太多,比如還有性能數(shù)據(jù)、頁面錯誤數(shù)據(jù)、console捕獲等。這里我們只講解業(yè)務數(shù)據(jù)的埋點。2021-05-05
Vue 3 中使用 Element Plus 的 `el-t
在 Vue 3 中使用 Element Plus 的 `el-table` 組件實現(xiàn)自適應高度,你可以根據(jù)容器的高度動態(tài)設置表格的高度,下面通過示例代碼給大家展示,感興趣的朋友一起看看吧2024-12-12
element-ui中實現(xiàn)tree子節(jié)點部分選中時父節(jié)點也選中
這篇文章主要介紹了element-ui中實現(xiàn)tree子節(jié)點部分選中時父節(jié)點也選中的方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08

