最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue?Router?返回后記住滾動條位置的實現方法

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

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

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

效果

這里涉及兩個功能點:

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

功能一: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,即可實現。代碼如下:

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 返回后滾動條跳轉到離開之前的位置

為了實現該功能,在網上查找,發(fā)現 scrollBehavior 出現最多,但經過測試,只能點擊瀏覽器自帶的返回按鈕才有效,如點擊自定義的按鈕返回則失敗。繼續(xù)找,發(fā)現以下這種方法可以實現,分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,頁面不會刷新所以組件內的生命周期方法都不會執(zhí)行,除了 activated 生命方法。官方說法當組件在 <keep-alive> 內被切換時,它的 activated 和 deactivated 這兩個生命周期鉤子函數將會被對應執(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 返回后記住滾動條位置的實現方法的文章就介紹到這了,更多相關vue返回記住滾動條位置內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 淺析vue中的組件傳值

    淺析vue中的組件傳值

    這篇文章主要介紹了淺析vue中的組件傳值,文章基于vue的相關資料展開對主題的詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • VUE axios上傳圖片到七牛的實例代碼

    VUE axios上傳圖片到七牛的實例代碼

    本篇文章主要介紹了VUE axios上傳圖片到七牛的實例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • 使用vue-cli腳手架工具搭建vue-webpack項目

    使用vue-cli腳手架工具搭建vue-webpack項目

    這篇文章主要介紹了使用vue-cli腳手架工具搭建vue-webpack項目,通過幾個默認的步驟幫助你快速的構建Vue.js項目。非常具有實用價值,需要的朋友可以參考下
    2019-01-01
  • Vue ECharts設置主題實現方法介紹

    Vue ECharts設置主題實現方法介紹

    這篇文章主要介紹了Vue ECharts設置主題,本文通過實例代碼圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • Vue實現彈出框點擊空白頁彈框消失效果

    Vue實現彈出框點擊空白頁彈框消失效果

    這篇文章主要介紹了VUE實現彈出框點擊空白頁彈框消失,實現方法可以在Vue中實現彈出框然后通過點擊空白頁面來讓彈窗隱藏,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Vue?+?element-ui?背景圖片設置方式

    Vue?+?element-ui?背景圖片設置方式

    這篇文章主要介紹了Vue?+?element-ui?背景圖片設置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue腳手架vue-cli的學習使用教程

    vue腳手架vue-cli的學習使用教程

    本篇文章主要介紹了vue腳手架vue-cli的學習使用教程,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • vue+Vue Router多級側導航切換路由(頁面)的實現代碼

    vue+Vue Router多級側導航切換路由(頁面)的實現代碼

    這篇文章主要介紹了vue+Vue Router多級側導航切換路由(頁面)的實現代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • vue如何動態(tài)綁定img的src屬性(v-bind)

    vue如何動態(tài)綁定img的src屬性(v-bind)

    這篇文章主要介紹了vue如何動態(tài)綁定img的src屬性(v-bind),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue3中的shallowRef?和shallowReactive對比分析

    Vue3中的shallowRef?和shallowReactive對比分析

    這篇文章主要介紹了Vue3中的shallowRef?和shallowReactive,通過示例代碼逐一對他們的使用做的詳細介紹,文末補充介紹了vue3的shallowRef()、shallowReactive()和shallowReadonly()的使用,需要的朋友可以參考下
    2023-01-01

最新評論

义乌市| 郸城县| 深水埗区| 山阴县| 宜阳县| 木兰县| 周口市| 屏东县| 南宫市| 略阳县| 凤凰县| 务川| 罗平县| 榆中县| 恭城| 柏乡县| 丘北县| 榆中县| 余干县| 秀山| 邹城市| 涪陵区| 福建省| 大埔区| 句容市| 丽江市| 绩溪县| 韶关市| 镇江市| 台州市| 交口县| 平江县| 和田市| 申扎县| 健康| 盘锦市| 峡江县| 长岛县| 新宁县| 彭泽县| 柳林县|