vue 路由跳轉記住滾動位置,返回時回到上次滾動位置


參考:https://blog.csdn.net/qq_40204835/article/details/79853685

方法一: 利用Keep-Alive和監聽器

1.首先在路由中引入需要的模塊

{ 
    path: ‘/scrollDemo’, 
    name: ‘scrollDemo’, 
    meta: { 
        keepAlive: true // 需要緩存 
    }, 
    component: resolve => { require([‘../view/scrollDemo.vue’],             
                                          resolve) } 
}    

2.在App.vue中設置緩存組件

 <keep-alive>   // 緩存組件跳轉的頁面
   <router-view v-if="$route.meta.keepAlive" class="ui-view"  transition-mode="out-in"></router-view>
 </keep-alive>  
  // 非緩存組件跳轉頁面
 <router-view v-if="!$route.meta.keepAlive" class="ui-view"  transition-mode="out-in"></router-view>

3.在頁面注冊對應的事件

(1). 在data中定義一個初始值 scroll

(2). 在mouted中 ,mouted中的方法代表dom已經加載完畢

window.addEventListener('scroll', this.handleScroll);

(3).methods 用於存放頁面函數

handleScroll () {
       this.scroll  = document.documentElement && document.documentElement.scrollTop
       console.log(this.scroll)
}    

4.activated 為keep-alive加載時調用

activated() {
    if(this.scroll > 0){
        window.scrollTo(0, this.scroll);
        this.scroll = 0;
        window.addEventListener('scroll', this.handleScroll);
     }
}

5.deactivated 頁面退出時關閉事件 防止其他頁面出現問題

deactivated(){
     window.removeEventListener('scroll', this.handleScroll);
}

 

方法二:利用beforeRouteLeave和watch


main.js中:

var store = new Vuex.Store({   //記得先引入vuex
    state: {
        recruitScrollY: 0
    },
    getters: {
        recruitScrollY: state => state.recruitScrollY
    },
    mutations: {
        changeRecruitScrollY(state, recruitScrollY) {
            state.recruitScrollY = recruitScrollY;
        }
    },
    actions: {

    },
    modules: {}
})

組件中(/flashSaleListX為當前組件,即需要記住滾動條位置的組件):

methods:{
      isTabRoute: function() {
            if (this.$route.path === '/flashSaleListX') {
                  let recruitScrollY = this.$store.state.recruitScrollY
                  document.documentElement.scrollTop = recruitScrollY;
            }
      }
},
watch: {
             '$route': 'isTabRoute',
},
beforeRouteLeave(to, from, next) {
      let position = document.documentElement && document.documentElement.scrollTop; //記錄離開頁面時的位置

      if (position == null) position = 0
      this.$store.commit('changeRecruitScrollY', position) //離開路由時把位置存起來
      next()
}

 方法三:(適用於方法二獲取不到滾動位置)

組件中:

<template>
  <div ref="div1">
  ··· 內容···
</div> </template>
beforeRouteEnter(to, from, next) {
   next(vm => {
     const div1 = vm.$refs.div1
     // 記錄滾動高度
     div1.scrollTop = vm.scroll
   })
},
beforeRouteLeave(to, from, next) {
   const div1 = this.$refs.div1;
   this.scroll = div1.scrollTop; //data中記得定義變量scroll
   next()
}

 注:在路由配置中,記住滾動的頁面keep-alive需為true


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM