欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue?Router?返回后記住滾動條位置的實現(xiàn)方法

 更新時間:2023年09月07日 10:52:26   作者:悅愛克魯伊夫  
使用?Vue?router?創(chuàng)建?SPA(Single?Page?App),往往有這種需求:首頁是列表頁,點擊列表項進入詳情頁,在詳情頁點擊返回首頁后,希望看到的是,首頁不刷新,并且滾動條停留在之前的位置,這篇文章主要介紹了Vue?Router?返回后記住滾動條位置的實現(xiàn)方法,需要的朋友可以參考下

使用 Vue router 創(chuàng)建 SPA(Single Page App),往往有這種需求:首頁是列表頁,點擊列表項進入詳情頁,在詳情頁點擊返回首頁后,希望看到的是,首頁不刷新,并且滾動條停留在之前的位置。

使用 Vue router 創(chuàng)建 SPA(Single Page App),往往有這種需求:首頁是列表頁,點擊列表項進入詳情頁,在詳情頁點擊返回首頁后,希望看到的是,首頁不刷新,并且滾動條停留在之前的位置。效果如圖:

效果

這里涉及兩個功能點:

  • route 返回后不刷新頁面
  • route 返回后滾動條跳轉(zhuǎn)到離開之前的位置

功能一:route 返回后不刷新頁面

該功能比較常用,使用 keep-alive 即可。首先 keep-alive 包裹 router-view ,代碼如下:

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

然后,在 router.js 中,對不需要刷新的 route 項 meta.keepAlive 標記為 true,即可實現(xiàn)。代碼如下:

export default new Router({
  ...
  routes: [
    {
      path: '/',
      name: 'home',
      component: Home,
      meta: {
        keepAlive: true // 需要緩存
      }
    },
    {
      path: '/about',
      name: 'about',
      component: () => import(/* webpackChunkName: "about" */ './views/About.vue'),
      meta: {
        keepAlive: false // 不需要緩存
      }
    }
  ]
  ...
})

功能二:route 返回后滾動條跳轉(zhuǎn)到離開之前的位置

為了實現(xiàn)該功能,在網(wǎng)上查找,發(fā)現(xiàn) scrollBehavior 出現(xiàn)最多,但經(jīng)過測試,只能點擊瀏覽器自帶的返回按鈕才有效,如點擊自定義的按鈕返回則失敗。繼續(xù)找,發(fā)現(xiàn)以下這種方法可以實現(xiàn),分2步:

  • 獲取并存儲頁面的 scrollTop value
  • 返回頁面時取出并設置 scrollTop value

第一步: 獲取并存儲頁面的 scrollTop value

首頁組件,點擊列表項 route 到詳情頁之前,先獲取存儲當前 scrollTop。查看 clickItem 方法,代碼如下:

<template>
  <div class="wrapper">
    <ul class="list">
      <li v-for="item in dataList" @click="clickItem(item)">
        {{ item }}
      </li>
    </ul>
  </div>  
</template>
<script>
  export default {
    name: 'simple-scollbehavior',
    data() {
      return {
        dataList: [
          'Start', '(′?ω?`) ', '(/TДT)/ ', '>?<',
          'o(*≧▽≦)ツ', '(? ? ?)?', '(o^?^o)?', ' (′?ω?)?',
          '(′?ω?`)', 'ヽ(?ω??)?', '(`?ω?′)', '╰(*°▽°*)╯',
          '╮( ̄▽ ̄)╭', '( ̄▽ ̄)~*', '(⊙?⊙)', '====',
          '(? ??_??)?', '(′?ω?`) ', '(/TДT)/ ', '>?<',
          '╮( ̄▽ ̄)╭', '( ̄▽ ̄)~*', '(⊙?⊙)', 'End'
        ],
        keepScroll: 0 // 記錄離開頁面時的 scroll-positon 
      };
    },
    methods: {
      clickItem(item){
        const scrollTop = Math.max(window.pageYOffset, document.documentElement.scrollTop, document.body.scrollTop)
        this.keepScroll = scrollTop;
        this.$router.push('/about')
      }
    }
  };
</script>

第二步:返回頁面時取出并設置 scrollTop value

由于首頁設置了 keepAlive,頁面不會刷新所以組件內(nèi)的生命周期方法都不會執(zhí)行,除了 activated 生命方法。官方說法當組件在 <keep-alive> 內(nèi)被切換時,它的 activated 和 deactivated 這兩個生命周期鉤子函數(shù)將會被對應執(zhí)行。

所以,將設置 scrollTop value 寫在 activated 即可。但這里遇到一個坑,直接寫無效,必須使用 setTimeOut 延遲執(zhí)行才有效。具體原因,還有待解惑。代碼如下:

<template>
...
</template>
<script>
  export default {
    name: 'simple-scollbehavior',
    ...
    //keep-alive 中組件激活 lifecircle-func
    //注意:必須 setTimeout 才能有效 scrollTop to body
    activated() {
      var gotoScroll = this.keepScroll
      setTimeout(function(){
          //兼容 PC and Mobile 寫兩個
          document.body.scrollTop = gotoScroll;
          document.documentElement.scrollTop = gotoScroll;
      }, 10);
    }
  };
</script>

完整代碼如下:

<template>
  <div class="wrapper">
    <ul class="list">
      <li v-for="item in dataList" @click="clickItem(item)">
        {{ item }}
      </li>
    </ul>
  </div>  
</template>
<script>
  export default {
    name: 'simple-scollbehavior',
    data() {
      return {
        dataList: [
          'Start', '(′?ω?`) ', '(/TДT)/ ', '>?<',
          'o(*≧▽≦)ツ', '(? ? ?)?', '(o^?^o)?', ' (′?ω?)?',
          '(′?ω?`)', 'ヽ(?ω??)?', '(`?ω?′)', '╰(*°▽°*)╯',
          '╮( ̄▽ ̄)╭', '( ̄▽ ̄)~*', '(⊙?⊙)', '====',
          '(? ??_??)?', '(′?ω?`) ', '(/TДT)/ ', '>?<',
          '╮( ̄▽ ̄)╭', '( ̄▽ ̄)~*', '(⊙?⊙)', 'End'
        ],
        keepScroll: 0 // 記錄離開頁面時的 scroll-positon 
      };
    },
    methods: {
      loadmore(loaded) {
        setTimeout(() => {
          this.dataList = this.dataList.concat(this.dataList);
          loaded('done');
        }, 2000);
      },
      clickItem(item){
        const scrollTop = Math.max(window.pageYOffset, document.documentElement.scrollTop, document.body.scrollTop)
        this.keepScroll = scrollTop;
        this.$router.push('/about')
      }
    },
    //keep-alive 中組件激活 lifecircle-func
    //注意:必須 setTimeout 才能有效 scrollTop to body
    activated() {
      var gotoScroll = this.keepScroll
      setTimeout(function(){
          //兼容 PC and Mobile 寫兩個
          document.body.scrollTop = gotoScroll;
          document.documentElement.scrollTop = gotoScroll;
          console.debug('set:' + gotoScroll)
      }, 10);
    }
  };
</script>

到此這篇關于Vue Router 返回后記住滾動條位置的實現(xiàn)方法的文章就介紹到這了,更多相關vue返回記住滾動條位置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 一文詳析vue3?Props的用法(父傳子)

    一文詳析vue3?Props的用法(父傳子)

    這篇文章主要給大家介紹了關于vue3?Props的用法(父傳子)的相關資料,在Vue3中Props用于組件間數(shù)據(jù)傳遞,允許類型檢查和默認值設置,文中將用法介紹的非常詳細,需要的朋友可以參考下
    2024-10-10
  • vue實現(xiàn)手風琴效果

    vue實現(xiàn)手風琴效果

    這篇文章主要為大家詳細介紹了vue實現(xiàn)手風琴效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • vue+elementUI 實現(xiàn)內(nèi)容區(qū)域高度自適應的示例

    vue+elementUI 實現(xiàn)內(nèi)容區(qū)域高度自適應的示例

    這篇文章主要介紹了vue+elementUI 實現(xiàn)內(nèi)容區(qū)域高度自適應的示例,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下
    2020-09-09
  • VUE3?Vite打包后動態(tài)圖片資源不顯示問題解決方法

    VUE3?Vite打包后動態(tài)圖片資源不顯示問題解決方法

    這篇文章主要給大家介紹了關于VUE3?Vite打包后動態(tài)圖片資源不顯示問題的解決方法,可能是因為在部署后的服務器環(huán)境中對中文文件名的支持不完善,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-09-09
  • 在Vue mounted方法中使用data變量詳解

    在Vue mounted方法中使用data變量詳解

    今天小編就為大家分享一篇在Vue mounted方法中使用data變量詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 使用webpack-obfuscator進行代碼混淆及報錯解決過程

    使用webpack-obfuscator進行代碼混淆及報錯解決過程

    隨著前端應用的復雜度增加,保護客戶端的JavaScript代碼變得更為重要,webpack-obfuscator插件通過對代碼進行混淆,如變量重命名、字符串加密等,提高代碼的保密性,防止源碼被輕易查看或修改
    2024-10-10
  • vue3表單輸入綁定方式

    vue3表單輸入綁定方式

    這篇文章主要介紹了vue3表單輸入綁定方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • vue使用mpegts.js的詳細步驟記錄

    vue使用mpegts.js的詳細步驟記錄

    MPEGTS.js是一個輕量級的JavaScript庫,用于處理MPEG-TS流,這篇文章主要給大家介紹了關于vue使用mpegts.js的詳細步驟記錄,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • 使用vue ant design分頁以及表格分頁改為中文問題

    使用vue ant design分頁以及表格分頁改為中文問題

    這篇文章主要介紹了使用vue ant design分頁以及表格分頁改為中文問題,具有很好的參考價值,希望對大家有所幫助。
    2023-04-04
  • Vue-cli3簡單使用(圖文步驟)

    Vue-cli3簡單使用(圖文步驟)

    這篇文章主要介紹了Vue-cli3簡單使用(圖文步驟),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04

最新評論