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

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

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

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

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

效果

這里涉及兩個功能點:

  • 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 標(biāo)記為 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
  • 返回頁面時取出并設(shè)置 scrollTop value

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

首頁組件,點擊列表項 route 到詳情頁之前,先獲取存儲當(dāng)前 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>

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

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

所以,將設(shè)置 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>

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

相關(guān)文章

  • 淺析vue中的組件傳值

    淺析vue中的組件傳值

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

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

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

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

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

    Vue ECharts設(shè)置主題實現(xiàn)方法介紹

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

    Vue實現(xiàn)彈出框點擊空白頁彈框消失效果

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

    Vue?+?element-ui?背景圖片設(shè)置方式

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

    vue腳手架vue-cli的學(xué)習(xí)使用教程

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

    vue+Vue Router多級側(cè)導(dǎo)航切換路由(頁面)的實現(xiàn)代碼

    這篇文章主要介紹了vue+Vue Router多級側(cè)導(dǎo)航切換路由(頁面)的實現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    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,通過示例代碼逐一對他們的使用做的詳細(xì)介紹,文末補充介紹了vue3的shallowRef()、shallowReactive()和shallowReadonly()的使用,需要的朋友可以參考下
    2023-01-01

最新評論

永寿县| 大竹县| 斗六市| 磐安县| 呼图壁县| 佛教| 庄浪县| 姜堰市| 福海县| 长阳| 岳普湖县| 逊克县| 昂仁县| 土默特左旗| 马边| 武陟县| 扎鲁特旗| 右玉县| 庆云县| 延吉市| 昂仁县| 肥西县| 南部县| 白山市| 桂东县| 杭州市| 吉木萨尔县| 天台县| 城口县| 临澧县| 合肥市| 呼伦贝尔市| 惠水县| 江孜县| 通渭县| 兴安盟| 淮滨县| 宁远县| 樟树市| 碌曲县| 邯郸市|