VUE單頁面文件實現返回上一頁面時保留之前的數據

最近在做PC端前端項目中,需要實現以下場景:

1.在頁面查詢列表,進入詳情頁時,返回需要頁面返回到上次瀏覽的位置(保留列表之前的當前頁和搜索條件數據)

2.由于查詢列表獲取的數據可能會短時間改變,如果前端長時間緩存數據,并不符合業(yè)務要求。

3.我在進入詳情頁時可以修改列表的數據,返回時滾動到,用戶看到的應該是最新的數據

4.每個列表頁面需要保存當前頁和搜索條件數據。

針對以上前幾點:

頁面的緩存,我們需要用到vue的內置組件keep-alive,來緩存列表頁面,同時配合路由選項來更改頁面的數據。

在設置keep-alive緩存的組件中,首次進入組件,會一次調用組件的鉤子函數:created --> mounted -->activated 再次進入時,只觸發(fā)activated鉤子函數

1.在路由出口渲染組件時配置:

  <keep-alive>
      <router-view v-if="$route.meta.keepAlive" class="router-view">
      </router-view>
  </keep-alive>
 <router-view v-if="!$route.meta.keepAlive" class="router-view" ></router-view>

2.在路由選項中,配置meta屬性,keepAlive為true即為需要緩存的組件,同時設置isBack屬性,用來標示頁面是否是從詳情頁面返回的。

{
name: '首頁',
path: 'index',
component: Index,
meta: {
keepAlive: true,
isBack: false
}
},
3.在組件實例中,通過beforeRouteEnter(to, from, next)路由守衛(wèi),來判斷路由是從哪里跳轉的,如果是從詳情頁跳轉的,則將當前路由對象的meta.isBack 設置為true,否則設為false

  beforeRouteEnter(to, from, next) {
    if (from.path == "/detail") {
      to.meta.isBack = true;
    } else {
      to.meta.isBack = false;
    }
    next();
  },

為了在其他頁面進入時,更新頁面中的列表數據,我們將在activated鉤子函數中掛載頁面初次進入時的請求數據:

  activated() {
    if (!this.$route.meta.isBack) {
      this.list = [];
      this.pageNum = 1;
      this.getList();
    }
    this.$route.meta.isBack = false;
  },

4.在進入詳情頁,需要對該條數據進行修改時,修改成功后返回,應該更新列表。

由于我們要在返回時滾動到瀏覽位置,因此不能去后臺重新請求數據(否則無法回到之前瀏覽的位置),而是采用前端保存修改的數據,并在返回的activated鉤子中對當前列表數據修改。

需要注意的事項:

由于vue自身限制,不能檢測到數組直接修改長度和利用索引設值 因此,需要使用vm.$set(vm.array,index,newValue)或者vm.array.splice(index,1,newValue)

然后根據頁面離開時保存的滾動位置,將頁面滾動到瀏覽位置。在router-view入口處,watch,$route對象,將keep-alive為true的頁面,滾動到上次瀏覽位置。

5.在頁面列表中,我們需要用到分頁加載數據,即滑動加載

在keep-alive組件中,頁面離開時,并不會銷毀當前的vue實例,而是保存在內存中。因此就會造成問題:頁面跳轉時,觸發(fā)了滑動事件,加載所有保存在內存中的滑動事件,改變了vue實例的數據。

因此,我們需要在組件的路由守衛(wèi)中,在頁面離開時beforeRouteLeave中把滑動事件禁用,然后再在頁面進入的時候,在activated鉤子中恢復滑動事件的。

注意: 使用keep-alive不能銷毀實例,vm.$destroy(); 否則再進入頁面,即使keep-alive為true也不會保存組件。如果keep-alive的頁面較多,可以使用,在路由守衛(wèi)中修改vuex的變量動態(tài)改變keep-alive的頁面變量。

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容