Keep-Alive中通過component多次加載同樣的動(dòng)態(tài)組件無法保持狀態(tài)的解決辦法

問題描述

項(xiàng)目功能上有需要?jiǎng)討B(tài)添加組件的需求,比如tab標(biāo)簽功能,動(dòng)態(tài)添加標(biāo)簽,同時(shí)添加后的標(biāo)簽在切換時(shí)需要保存狀態(tài),自然而然想到了keepalive,這就有了下面的代碼:

一、tabPage 定義方式1:

通過components事先定義好所有會(huì)加載的組件:


tagPage
通過ref或computed的方式判斷當(dāng)前的標(biāo)簽的類型并返回:


這個(gè)時(shí)候
keep
alive是工作的,但這里的問題是:

動(dòng)態(tài)創(chuàng)建的組件有多個(gè)是同一個(gè)組件,比如APIAdd,

由于keep?alive的緩存機(jī)制是通過組件名稱來緩存的,同一個(gè)組件被打開多次的話其實(shí)顯示的還是第一次打開的那個(gè),這和我們實(shí)際的應(yīng)用場(chǎng)景不符合,不能緩存界面狀態(tài)(比如表單中輸入的內(nèi)容)

二、tabPage 定義方式2

為了解決方式1中的同名組件只能加載一次的問題,需要同一個(gè)組件被加載多次,只是里面展示的內(nèi)容不一樣,所以tabPage通過defineAsyncComponent異步加載:


這里組件能加載成功,同名組件每次創(chuàng)建標(biāo)簽都會(huì)生成一個(gè)新的,但是這里的問題是:

沒有起到keepalive的效果,已經(jīng)加載的組件,在切換時(shí)又重新創(chuàng)建了組件,?狀態(tài)自然也沒有得到保存,

解決辦法:

為了解決同一個(gè)組件可以被動(dòng)態(tài)加載多次,同時(shí)需要能keepalive,解決的辦法就是不用component,而是把所有動(dòng)態(tài)添加的組件都各自放在一個(gè)keepalive中,根據(jù)條件切換顯示即可:


這樣每個(gè)組件都可以加載自己的數(shù)據(jù),并且可以
keep
?alive保存狀態(tài):