Vue頁面返回滾動位置恢復(fù)(keep-alive滾動記憶)
在Vue單頁應(yīng)用開發(fā)中,我們經(jīng)常會遇到這樣的場景:用戶在一個長列表頁面滾動瀏覽了若干項后,點擊進入詳情頁,然后返回期望能夠回到之前的滾動位置,而不是重新回到頁面頂部。這種用戶體驗的優(yōu)化對于內(nèi)容型應(yīng)用尤為重要。
Vue的<keep-alive>組件可以緩存頁面狀態(tài),但它并不自動保存和恢復(fù)滾動位置。今天我們就來探討一種優(yōu)雅的解決方案。
核心代碼解析
import { onActivated, ref } from "vue";
import { onBeforeRouteLeave } from "vue-router";
export function useScroll(targetRef) {
const scrollTop = ref(0);
onActivated(() => {
if (targetRef.value) {
targetRef.value.scrollTop = scrollTop.value
}
})
onBeforeRouteLeave(() => {
if (targetRef.value) {
scrollTop.value = targetRef.value.scrollTop
}
})
}
這個自定義組合式函數(shù)useScroll雖然代碼簡潔,但功能強大且完整。讓我們分解一下它的工作原理:
1. 響應(yīng)式狀態(tài)管理
使用ref(0)創(chuàng)建了一個響應(yīng)式的scrollTop變量,用于存儲滾動位置。
2. 生命周期鉤子運用
onActivated: 當(dāng)被<keep-alive>緩存的組件激活時調(diào)用,用于恢復(fù)滾動位置onBeforeRouteLeave: 在路由離開之前調(diào)用,用于保存當(dāng)前滾動位置
3. 引用DOM元素
通過targetRef參數(shù)接收一個DOM元素的引用,這使得函數(shù)可以靈活應(yīng)用于任何可滾動元素
完整使用示例
<template>
<div class="product-list" ref="scrollTarget">
<div v-for="product in products" :key="product.id" class="product-item">
<h3>{{ product.name }}</h3>
<p>{{ product.description }}</p>
<button @click="goToDetail(product)">查看詳情</button>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'
import { useScroll } from '@/composables/useScroll'
const router = useRouter()
const scrollTarget = ref(null)
const products = ref([...]) // 產(chǎn)品列表數(shù)據(jù)
// 使用滾動記憶功能
useScroll(scrollTarget)
const goToDetail = (product) => {
router.push(`/product/${product.id}`)
}
</script>
<style scoped>
.product-list {
height: 100vh;
overflow-y: auto;
}
</style>
路由配置要點
為了使<keep-alive>生效,需要在路由配置和組件渲染中做相應(yīng)設(shè)置:
// router.js
const routes = [
{
path: '/products',
component: () => import('@/views/ProductsView.vue'),
meta: { keepAlive: true } // 添加元信息標(biāo)識需要緩存的頁面
}
// ...其他路由
]
<!-- App.vue -->
<template>
<router-view v-slot="{ Component, route }">
<keep-alive>
<component
:is="Component"
v-if="route.meta.keepAlive"
:key="route.name"
/>
</keep-alive>
<component
:is="Component"
v-if="!route.meta.keepAlive"
:key="route.name"
/>
</router-view>
</template>
進階優(yōu)化
1. 多滾動容器支持
實際應(yīng)用中,一個頁面可能有多個滾動區(qū)域,我們可以擴展useScroll來支持這種情況:
export function useScroll(targetRef, identifier = 'default') {
const scrollPositions = ref({});
onActivated(() => {
if (targetRef.value) {
targetRef.value.scrollTop = scrollPositions.value[identifier] || 0;
}
})
onBeforeRouteLeave(() => {
if (targetRef.value) {
scrollPositions.value[identifier] = targetRef.value.scrollTop;
}
})
}
2. 防抖處理
對于高頻觸發(fā)滾動事件的情況,可以添加防抖優(yōu)化:
import { debounce } from 'lodash-es';
export function useScroll(targetRef) {
const scrollTop = ref(0);
onActivated(() => {
if (targetRef.value) {
targetRef.value.scrollTop = scrollTop.value;
}
})
const saveScrollPosition = debounce(() => {
if (targetRef.value) {
scrollTop.value = targetRef.value.scrollTop;
}
}, 100);
onMounted(() => {
if (targetRef.value) {
targetRef.value.addEventListener('scroll', saveScrollPosition);
}
});
onUnmounted(() => {
if (targetRef.value) {
targetRef.value.removeEventListener('scroll', saveScrollPosition);
}
});
}
到此這篇關(guān)于Vue頁面返回滾動位置恢復(fù)(keep-alive滾動記憶)的文章就介紹到這了,更多相關(guān)Vue 滾動位置恢復(fù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 解決Vue頁面固定滾動位置的處理辦法
- Vue實現(xiàn)渲染數(shù)據(jù)后控制滾動條位置(推薦)
- vue實現(xiàn)滾動條到頂部或者到指定位置
- vue中實現(xiàn)點擊按鈕滾動到頁面對應(yīng)位置的方法(使用c3平滑屬性實現(xiàn))
- vue監(jiān)聽頁面中的某個div的滾動事件并判斷滾動的位置
- Vue滾動到指定位置的多種方式示例詳解
- Vue滾動頁面到指定位置的實現(xiàn)及避坑
- Vue列表如何實現(xiàn)滾動到指定位置樣式改變效果
- 解決vue無法設(shè)置滾動位置的問題
- vue通過滾動行為實現(xiàn)從列表到詳情,返回列表原位置的方法
- vue-scroller記錄滾動位置的示例代碼
相關(guān)文章
vue修改打包配置如何實現(xiàn)代碼打包后的自定義命名
這篇文章主要介紹了vue修改打包配置如何實現(xiàn)代碼打包后的自定義命名,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-05-05
Vue監(jiān)聽滾動實現(xiàn)錨點定位(雙向)示例
今天小編大家分享一篇Vue監(jiān)聽滾動實現(xiàn)錨點定位(雙向)示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11
如何解決elementUI打包上線后icon圖標(biāo)偶爾亂碼問題
文章描述了在使用若依框架開發(fā)過程中遇到的圖標(biāo)亂碼問題,通過分析發(fā)現(xiàn)是由于sass編譯器將Unicode編碼轉(zhuǎn)換為明文導(dǎo)致的,文章提供了四種處理方法:使用css-unicode-loader、升高sass版本、替換element-ui的樣式文件和更換打包壓縮方式2025-01-01
Vue 解決在element中使用$notify在提示信息中換行問題
這篇文章主要介紹了Vue 解決在element中使用$notify在提示信息中換行問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11

