使用vue開發(fā)時(shí),當(dāng)進(jìn)行頁(yè)面之間的切換時(shí),上一個(gè)頁(yè)面將會(huì)被銷毀。但是當(dāng)我們想節(jié)省性能以及保留用戶上次操作的結(jié)果或避免ajax重復(fù)請(qǐng)求的時(shí)候,需要把某些特定的頁(yè)面緩存下來。
在vue中,提供了內(nèi)置組件 keep-alive , <keep-alive> 包裹動(dòng)態(tài)組件時(shí),會(huì)緩存不活動(dòng)的組件實(shí)例,而不是銷毀它們。和 <transition> 相似,<keep-alive> 是一個(gè)抽象組件:它自身不會(huì)渲染一個(gè) DOM 元素,也不會(huì)出現(xiàn)在父組件鏈中。
當(dāng)組件在 <keep-alive> 內(nèi)被切換,它的 activated 和 deactivated 這兩個(gè)生命周期鉤子函數(shù)將會(huì)被對(duì)應(yīng)執(zhí)行。
當(dāng)我們想把所有頁(yè)面都緩存時(shí),只需要用 keep-alive 包裹 router-view 即可。
但是大多數(shù)情況下,我們只需要把某些不需要請(qǐng)求的頁(yè)面緩存下來。則我們需要某些特定的頁(yè)面實(shí)現(xiàn)緩存即可。
解決方法: 通過v-if 監(jiān)聽指定變量來實(shí)現(xiàn)對(duì)指定頁(yè)面的緩存;此處我監(jiān)聽的是 $route.meta 中自定義的變量。
給需要緩存的頁(yè)面其 $route.meta 值設(shè)為 true, 不需要設(shè)為 false 。在頁(yè)面發(fā)生切換時(shí), 其 $route.meta 會(huì)做出對(duì)應(yīng)變化,通過watch 可以實(shí)時(shí)監(jiān)聽到 。
之后通過v-if 來綁定此變量即可。
效果:
某一些特定場(chǎng)景下,跳轉(zhuǎn)頁(yè)面后再返回我們不希望銷毀組件,而是希望頁(yè)面緩存下來,保存跳轉(zhuǎn)前的狀態(tài),這時(shí)候就可以用到keep-alive組件。
要:禁止input緩存,禁止select緩存
有時(shí)候,我們頁(yè)面的輸入框,我們?cè)夙?yè)面里輸入內(nèi)容后,并不保存,但是刷新頁(yè)面會(huì)發(fā)現(xiàn)值為輸入的頁(yè)面,完全沒有從新去從后臺(tái)取值,這是怎么回事呢?如下:
雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆雷姆雷姆拉姆拉姆
<input type="text" value="">
<select>
<option value="1">1</option>
<option value="2">1</option>
</select>
其實(shí)多數(shù)瀏覽器默認(rèn)會(huì)緩存input的值,只有使用ctl+F5強(qiáng)制刷新的才可以清除緩存記錄。如果不想讓瀏覽器緩存input的值,很簡(jiǎn)單,只需要價(jià)格屬性即可:autocomplete=”off”。
例如上面例子,改為如下就不會(huì)緩存啦:
<input type="text" autocomplete="off" value="">
<select autocomplete="off">
<option value="1">1</option>
<option value="2">1</option>
</select>
聽說還有一種直接加在form表單里也可以,但是因?yàn)槲乙呀?jīng)很久沒有用form表單提交數(shù)據(jù)啦,都是用ajax異步提交的,所以我就沒有采取這種方法,也很簡(jiǎn)單的如下:
<form action="#" autocomplete="off">
<input type="text" value/>
</form>
當(dāng)然,沒試過不知道行不行,應(yīng)該是沒問題的!
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。