vue Tab切換以及緩存頁面處理的幾種方式
前言
相信tab切換對(duì)于大家來說都不算陌生,后臺(tái)管理系統(tǒng)中多會(huì)用到。如果不知道的話,可以看一下瀏覽器上方的標(biāo)簽頁切換,大概效果就是這樣。
1.如何切換
使用動(dòng)態(tài)組件,相信大家都能看懂(部分代碼省略)
//通過點(diǎn)擊就可以實(shí)現(xiàn)兩個(gè)組件來回切換
<button @click="changeView">切換view</button>
<component :is="currentView"></component>
import pageA from "@/views/pageA";
import pageB from "@/views/pageB";
computed: {
currentView(){
return this.viewList[this.index];
}
},
methods: {
changeView() {
this.index=(++this.index)%2
}
}
注:這個(gè)多用于單頁下的幾個(gè)子模塊使用,一般切換比較多使用下面的路由
使用路由(這個(gè)就是配置路由的問題了,不作贅述)2.動(dòng)態(tài)生成tab
一般UI框架給我們的tab切換都像是上面的那種,需要自己寫入幾個(gè)tab頁之類的配置。但是我們?nèi)绻胍ㄟ^點(diǎn)擊左邊的目錄來生成一個(gè)tab頁并且可以隨時(shí)關(guān)閉呢(如下圖)?

只需要給路由一個(gè)點(diǎn)擊事件,把你的路由地址保存到一個(gè)列表,渲染成另一個(gè)平鋪的tab目錄即可
假設(shè)你的布局是這樣,左邊的目錄,上邊的tab,有字的是頁面

<menu>
<menu-item v-for="(item,index) in menuList" :key="index" @click="addToTabList(item.path)">
<router-link :to="item.path">{{item.name}}</router-link>
<menu-item>
</menu>
<template>
<menu class="left"/>//menu代碼部分如上
<div class="right">
<tab-list>
<tab-item v-for="(item,index) in tabList" :key="index">
<router-link :to="item.path">{{item.name}}</router-link>
<icon class="delete" @click="deleteTab"></icon>
</tab-item>
</tab-list>
<page-view>
<router-view></router-view>//這里是頁面展示
</page-view>
</div>
</template>
以上代碼并非實(shí)際代碼,只提供一個(gè)大概的思路。至于addToTabList和deleteTab怎么做就是數(shù)組方法的簡單push和splice操作了。為了效果好看,我們可能還需要一些tab的active樣式,這里不作演示。
3.緩存組件
僅僅是做tab切換,遠(yuǎn)遠(yuǎn)是不夠的,畢竟大家想要tab頁就是要來回切換操作,我們需要保存他在不同tab里操作的進(jìn)度,比如說填寫的表單信息,或者已經(jīng)查詢好的數(shù)據(jù)列表等。
那么我們要怎么緩存組件呢?
只需要用到vue中的keep-alive組件
3.1 keep-alive
<keep-alive>是Vue的內(nèi)置組件,能在組件切換過程中將狀態(tài)保留在內(nèi)存中,防止重復(fù)渲染DOM。<keep-alive>包裹動(dòng)態(tài)組件時(shí),會(huì)緩存不活動(dòng)的組件實(shí)例,而不是銷毀它們。<keep-alive>與<transition>相似,只是一個(gè)抽象組件,它不會(huì)在DOM樹中渲染(真實(shí)或者虛擬都不會(huì)),也不在父組件鏈中存在,比如:你永遠(yuǎn)在this.$parent中找不到keep-alive。
注:不能使用keep-alive來緩存固定組件,會(huì)無效
//無效 <keep-alive> <my-component></my-component> </keep-alive>
3.2 使用
3.2.1 老版本vue 2.1之前的使用
<keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"></router-view>
需要在路由信息里面設(shè)置router的元信息meta
export default new Router({
routes: [
{
path: '/a',
name: 'A',
component: A,
meta: {
keepAlive: false // 不需要緩存
}
},
{
path: '/b',
name: 'B',
component: B,
meta: {
keepAlive: true // 需要被緩存
}
}
]
})
3.2.2 比較新而且簡單的用法
直接緩存所有組件/路由
<keep-alive> <router-view/> </keep-alive> <keep-alive> <component :is="view"></component> </keep-alive>
使用include來處理需要緩存的組件/路由
include有幾種用法,可以是數(shù)組,字符串用標(biāo)點(diǎn)隔開,也可以是正則,使用正則的時(shí)候需要使用v-bind來綁定。
<keep-alive include="['a','b']">//緩存name為a,b的組件 <keep-alive include ="a,b">//緩存name為a,b的組件 <keep-alive :include="/^store/">//緩存name以store開頭的組件 <router-view/>//可以為router-view <component :is="view"></component>//也可以是動(dòng)態(tài)組件 </keep-alive>
使用exclude來排除不需要緩存的路由
跟include正好相反,在exclude里的組件不會(huì)被緩存。用法類似,不作贅述
3.2.3 一種比較奇怪的情況
當(dāng)頁面跳轉(zhuǎn)方式有A->C和B->C兩種,但是我們從A到C的時(shí)候,不需要緩存,從B到C的時(shí)候需要緩存。這時(shí)候就要用到路由的鉤子結(jié)合老版本用法來實(shí)現(xiàn)了。
export default {
data() {
return {};
},
methods: {},
beforeRouteLeave(to, from, next) {
to.meta.keepAlive = false; // 讓下一頁不緩存
next();
}
};
export default {
data() {
return {};
},
methods: {},
beforeRouteLeave(to, from, next) {
// 設(shè)置下一個(gè)路由的 meta
to.meta.keepAlive = true; //下一頁緩存
next();
}
};
3.3 緩存組件的生命周期函數(shù)
緩存組件第一次打開的時(shí)候,和普通組件一樣,也需要執(zhí)行created, mounted等函數(shù)。
但是在被再次激活和被停用時(shí),這幾個(gè)普通組件的生命周期函數(shù)都不會(huì)執(zhí)行,會(huì)執(zhí)行兩個(gè)比較獨(dú)特的生命周期函數(shù)。
activated
這個(gè)會(huì)在緩存的組件重新激活時(shí)調(diào)用
deactivated
這個(gè)會(huì)在緩存的組件停用時(shí)調(diào)用
結(jié)語
這個(gè)是很基礎(chǔ)的知識(shí),放在筆記里很久了,不過之前記得有點(diǎn)亂,今天拿出來抖一下塵~
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解vue2.0 使用動(dòng)態(tài)組件實(shí)現(xiàn) Tab 標(biāo)簽頁切換效果(vue-cli)
- 詳解使用vue實(shí)現(xiàn)tab 切換操作
- 解決vue中el-tab-pane切換的問題
- Vue.js組件tabs實(shí)現(xiàn)選項(xiàng)卡切換效果
- 基于Vue實(shí)現(xiàn)tab欄切換內(nèi)容不斷實(shí)時(shí)刷新數(shù)據(jù)功能
- Vue.js組件tab實(shí)現(xiàn)選項(xiàng)卡切換
- VUE的tab頁面切換的四種方法
- vue實(shí)現(xiàn)tab切換的3種方式及切換保持?jǐn)?shù)據(jù)狀態(tài)
- vue實(shí)現(xiàn)tab切換外加樣式切換方法
- vue實(shí)現(xiàn)tab欄切換效果
相關(guān)文章
vue項(xiàng)目中vue-i18n和element-ui國際化開發(fā)實(shí)現(xiàn)過程
這篇文章主要介紹了vue項(xiàng)目中vue-i18n和element-ui國際化開發(fā)實(shí)現(xiàn)過程,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04
vue中axios的post請(qǐng)求,415錯(cuò)誤的問題
這篇文章主要介紹了vue中axios的post請(qǐng)求,415錯(cuò)誤的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
vue單頁應(yīng)用在頁面刷新時(shí)保留狀態(tài)數(shù)據(jù)的方法
今天小編就為大家分享一篇vue單頁應(yīng)用在頁面刷新時(shí)保留狀態(tài)數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09
vue實(shí)現(xiàn)todolist基本功能以及數(shù)據(jù)存儲(chǔ)功能實(shí)例詳解
本文通過實(shí)例代碼給大家介紹了vue實(shí)現(xiàn)todolist基本功能以及數(shù)據(jù)存儲(chǔ)功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04
vue內(nèi)嵌iframe跨域通信的實(shí)例代碼
這篇文章主要介紹了vue內(nèi)嵌iframe跨域通信,主要介紹了Vue組件中如何引入iframe,vue如何獲取iframe對(duì)象以及iframe內(nèi)的window對(duì)象,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì)需要的朋友可以參考下2022-11-11
基于vue-cli創(chuàng)建的項(xiàng)目的目錄結(jié)構(gòu)及說明介紹
下面小編就為大家分享一篇基于vue-cli創(chuàng)建的項(xiàng)目的目錄結(jié)構(gòu)及說明介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助2017-11-11
vue使用動(dòng)畫實(shí)現(xiàn)滾動(dòng)表格效果
這篇文章主要為大家詳細(xì)介紹了vue使用動(dòng)畫實(shí)現(xiàn)滾動(dòng)表格效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
web前端Vue報(bào)錯(cuò):Uncaught?(in?promise)?TypeError:Cannot?read?
這篇文章主要給大家介紹了關(guān)于web前端Vue報(bào)錯(cuò):Uncaught?(in?promise)?TypeError:Cannot?read?properties?of?nu的解決方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-01-01
15分鐘學(xué)會(huì)vue項(xiàng)目改造成SSR(小白教程)
這篇文章主要介紹了15分鐘學(xué)會(huì)vue項(xiàng)目改造成SSR(小白教程),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Vue中進(jìn)行分布式鑒權(quán)與認(rèn)證的過程
在Vue應(yīng)用中,我們通常需要實(shí)現(xiàn)分布式鑒權(quán)和認(rèn)證,以確保用戶的安全性和數(shù)據(jù)的保密性,本文將介紹在Vue中如何進(jìn)行分布式鑒權(quán)與認(rèn)證,需要的朋友可以參考下2023-06-06

