解決VUE3 keep-alive頁(yè)面切換報(bào)錯(cuò)parentComponent.ctx.deactivate
vue3 keep-alive頁(yè)面切換報(bào)錯(cuò):parentComponent.ctx.deactivate is not a function
問題
我們使用判斷時(shí) 有時(shí)候會(huì)報(bào)錯(cuò)
<router-view v-slot="{ Component }">
<keep-alive >
<component :is="Component" v-if="$route.meta.keepAlive" />
</keep-alive>
<component :is="Component" v-if="!$route.meta.keepAlive" />
</router-view>
//keepAlive是在路由里邊定義的meta字段 true/false
解決
這個(gè)時(shí)候我們只需在 <component> 標(biāo)簽上添加 :key=" 唯一值" 就可以解決了,只要是唯一的就可以沒有指定要求 推薦使用 $route.name
<router-view v-slot="{ Component }">
<keep-alive >
<component :is="Component" :key="$route.name" v-if="$route.meta.keepAlive" />
</keep-alive>
<component :is="Component" :key="$route.name" v-if="!$route.meta.keepAlive" />
</router-view>vue頁(yè)面切換keep-alive導(dǎo)致的數(shù)據(jù)問題
問題描述
每個(gè)頁(yè)面通過computed和watch監(jiān)測(cè)vuex參數(shù),在參數(shù)變化時(shí)請(qǐng)求ajax更新數(shù)據(jù)。
在公共組件改變參數(shù)時(shí),所有頁(yè)面都會(huì)去重新請(qǐng)求數(shù)據(jù),當(dāng)前頁(yè)面根據(jù)數(shù)據(jù)重新渲染,但切換回其他頁(yè)面時(shí),由于keep-alive,頁(yè)面沒有變化。
//vuex store.js
const state = {
classes: "",
day: "",
}
const mutations = {
updateClasses(state,payload) {
state.classes=payload
},
updateDay(state,payload) {
state.day=payload
},
}
//vue computed
classes() {
return this.$store.state.classes
},
day() {
return this.$store.state.day
},
//vue watch
classes(val) {
this.updateClassChange()//ajax請(qǐng)求
},
day(val) {
this.updateDayChange()//ajax請(qǐng)求
}
//公共組件
this.$store.commit('updateClasses', {this.classs})
this.$store.commit('updateDay', {this.day})解決方法一
第一步:判斷此時(shí)路由是否是當(dāng)前頁(yè)面,避免多余的數(shù)據(jù)請(qǐng)求,只有當(dāng)前頁(yè)面重新請(qǐng)求數(shù)據(jù)
watch: {
classes(val) {
if(this.$route.name=="index") {
this.updateClassChange()
}
},
day(val) {
if(this.$route.name=="index") {
this.updateDayChange()
}
}
},第二部:是用鉤子函數(shù)activated,每切換路由時(shí)重新加載,避免參數(shù)變化時(shí)頁(yè)面沒有變化
activated() {
if(this.$route.name=="index"){
this.init()
}
},該方案問題:參數(shù)不變時(shí),雖然不重新渲染,但每次切換路由也會(huì)重新請(qǐng)求
解決方法二
在vue為每一個(gè)頁(yè)面存儲(chǔ)一個(gè)公共組件參數(shù),使個(gè)頁(yè)面參數(shù)相互不干擾,keep-alive也不混亂
//vuex store.js
const state = {
classesObj:{
index:"",
addict:"",
consume:"",
mental:""
},
dayObj:{
index:"",
addict:"",
consume:"",
mental:""
},
}
const mutations = {
setClassesObj(state,payload){
if(payload.index){
state.classesObj.index=payload.index
}
if(payload.addict){
state.classesObj.addict=payload.addict
}
if(payload.consume){
state.classesObj.consume=payload.consume
}
if(payload.mental){
state.classesObj.mental=payload.mental
}
},
setDayObj(state,payload){
if(payload.index){
state.dayObj.index=payload.index
}
if(payload.addict){
state.dayObj.addict=payload.addict
}
if(payload.consume){
state.dayObj.consume=payload.consume
}
if(payload.mental){
state.dayObj.mental=payload.mental
}
},
}
//vue computed
classes() {
return this.$store.state.classesObj[this.$route.name]
},
day() {
return this.$store.state.dayObj[this.$route.name]
},
//vue watch
classes(val) {
this.updateClassChange()//ajax請(qǐng)求
},
day(val) {
this.updateDayChange()//ajax請(qǐng)求
}
//公共組件
this.$store.commit('setClassesObj', {[this.$route.name]:this.classs})
this.$store.commit('setDayObj', {[this.$route.name]:this.day})總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue實(shí)現(xiàn)菜單權(quán)限控制的示例代碼
這篇文章主要介紹了vue實(shí)現(xiàn)菜單權(quán)限控制的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
使用element+vuedraggable實(shí)現(xiàn)圖片上傳拖拽排序
這篇文章主要為大家詳細(xì)介紹了使用element+vuedraggable實(shí)現(xiàn)圖片上傳拖拽排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
vue實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)和參數(shù)傳遞的兩種方式
這篇文章主要介紹了vue頁(yè)面跳轉(zhuǎn)和參數(shù)傳遞的兩種方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
Element通過v-for循環(huán)渲染的form表單校驗(yàn)的實(shí)現(xiàn)
日常業(yè)務(wù)開發(fā)中,form表單校驗(yàn)是一個(gè)很常見的問題,本文主要介紹了Element通過v-for循環(huán)渲染的form表單校驗(yàn)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
一篇文章帶你吃透Vue生命周期(結(jié)合案例通俗易懂)
這篇文章主要給大家介紹了關(guān)于如何通過一篇文章帶你吃透Vue生命周期,文章通過結(jié)合案例更加的通俗易懂,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
vue iview組件表格 render函數(shù)的使用方法詳解
下面小編就為大家分享一篇vue iview組件表格 render函數(shù)的使用方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-03-03
Vue 使用beforeEach實(shí)現(xiàn)登錄狀態(tài)檢查功能
今天小編就為大家分享一篇Vue 使用beforeEach實(shí)現(xiàn)登錄狀態(tài)檢查功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-10-10
使用vue如何構(gòu)建一個(gè)自動(dòng)建站項(xiàng)目
這篇文章主要介紹了使用vue如何構(gòu)建一個(gè)自動(dòng)建站項(xiàng)目,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
深入理解Vue.js3中Reactive的實(shí)現(xiàn)
reactive是Vue 3的Composition API中的一個(gè)函數(shù),它允許你創(chuàng)建一個(gè)響應(yīng)式的數(shù)據(jù)對(duì)象,本文主要介紹了深入理解Vue.js3中Reactive的實(shí)現(xiàn),感興趣的可以了解一下2024-01-01

