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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue+elementUI 實現(xiàn)內(nèi)容區(qū)域高度自適應的示例
這篇文章主要介紹了vue+elementUI 實現(xiàn)內(nèi)容區(qū)域高度自適應的示例,幫助大家更好的理解和使用vue,感興趣的朋友可以了解下2020-09-09VUE3?Vite打包后動態(tài)圖片資源不顯示問題解決方法
這篇文章主要給大家介紹了關于VUE3?Vite打包后動態(tài)圖片資源不顯示問題的解決方法,可能是因為在部署后的服務器環(huán)境中對中文文件名的支持不完善,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-09-09使用webpack-obfuscator進行代碼混淆及報錯解決過程
隨著前端應用的復雜度增加,保護客戶端的JavaScript代碼變得更為重要,webpack-obfuscator插件通過對代碼進行混淆,如變量重命名、字符串加密等,提高代碼的保密性,防止源碼被輕易查看或修改2024-10-10使用vue ant design分頁以及表格分頁改為中文問題
這篇文章主要介紹了使用vue ant design分頁以及表格分頁改為中文問題,具有很好的參考價值,希望對大家有所幫助。2023-04-04