亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Vue頁面返回滾動位置恢復(keep-alive滾動記憶)

 更新時間:2025年09月21日 08:35:18   作者:_AaronWong  
Vue中通過自定義組合式函數(shù)useScroll,結(jié)合ref響應式狀態(tài)、生命周期鉤子及DOM引用,實現(xiàn)keep-alive緩存組件的滾動位置保存與恢復,優(yōu)化用戶返回時的瀏覽體驗,感興趣的可以了解一下

在Vue單頁應用開發(fā)中,我們經(jīng)常會遇到這樣的場景:用戶在一個長列表頁面滾動瀏覽了若干項后,點擊進入詳情頁,然后返回期望能夠回到之前的滾動位置,而不是重新回到頁面頂部。這種用戶體驗的優(yōu)化對于內(nèi)容型應用尤為重要。

Vue的<keep-alive>組件可以緩存頁面狀態(tài),但它并不自動保存和恢復滾動位置。今天我們就來探討一種優(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. 響應式狀態(tài)管理

使用ref(0)創(chuàng)建了一個響應式的scrollTop變量,用于存儲滾動位置。

2. 生命周期鉤子運用

  • onActivated: 當被<keep-alive>緩存的組件激活時調(diào)用,用于恢復滾動位置
  • onBeforeRouteLeave: 在路由離開之前調(diào)用,用于保存當前滾動位置

3. 引用DOM元素

通過targetRef參數(shù)接收一個DOM元素的引用,這使得函數(shù)可以靈活應用于任何可滾動元素

完整使用示例

<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>生效,需要在路由配置和組件渲染中做相應設(shè)置:

// router.js
const routes = [
  {
    path: '/products',
    component: () => import('@/views/ProductsView.vue'),
    meta: { keepAlive: true } // 添加元信息標識需要緩存的頁面
  }
  // ...其他路由
]
<!-- 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. 多滾動容器支持

實際應用中,一個頁面可能有多個滾動區(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頁面返回滾動位置恢復(keep-alive滾動記憶)的文章就介紹到這了,更多相關(guān)Vue 滾動位置恢復內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • 面試官問你Vue2的響應式原理該如何回答?

    面試官問你Vue2的響應式原理該如何回答?

    可能很多小伙伴之前都了解過?Vue2實現(xiàn)響應式的核心是利用了ES5的Object.defineProperty?但是面對面試官時如果只知道一些模糊的概念。只有深入底層了解響應式的原理,才能在關(guān)鍵時刻對答如流,本文就來和大家詳細聊聊,感興趣的可以收藏一下
    2022-12-12
  • vue3實現(xiàn)點擊空白區(qū)域隱藏div

    vue3實現(xiàn)點擊空白區(qū)域隱藏div

    這篇文章主要介紹了vue3實現(xiàn)點擊空白區(qū)域隱藏div方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 關(guān)于vue中@click.native.prevent的說明

    關(guān)于vue中@click.native.prevent的說明

    這篇文章主要介紹了關(guān)于vue中@click.native.prevent的說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 在antd4.0中Form使用initialValue操作

    在antd4.0中Form使用initialValue操作

    這篇文章主要介紹了在antd4.0中Form使用initialValue操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • elementui導出數(shù)據(jù)為xlsx、excel表格

    elementui導出數(shù)據(jù)為xlsx、excel表格

    本文主要介紹了elementui導出數(shù)據(jù)為xlsx、excel表格,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Vue使用Sentry實現(xiàn)錯誤監(jiān)控

    Vue使用Sentry實現(xiàn)錯誤監(jiān)控

    Sentry?是一款功能強大的開源錯誤監(jiān)控服務,廣泛用于追蹤和修復應用中的異常情況,本文將詳細介紹如何在?Vue?應用中集成和使用?Sentry,感興趣的可以了解下
    2024-11-11
  • vue利用Moment插件格式化時間的實例代碼

    vue利用Moment插件格式化時間的實例代碼

    Moment.js 是一個 JavaScript 日期處理類庫,用于解析、檢驗、操作、以及顯示日期。這篇文章主要給大家介紹了關(guān)于vue利用Moment插件格式化時間的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • vue實現(xiàn)圖片加載完成前的loading組件方法

    vue實現(xiàn)圖片加載完成前的loading組件方法

    下面小編就為大家分享一篇vue實現(xiàn)圖片加載完成前的loading組件,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • element-ui動態(tài)級聯(lián)選擇器回顯問題詳解(二十多行代碼搞定)

    element-ui動態(tài)級聯(lián)選擇器回顯問題詳解(二十多行代碼搞定)

    大家在使用element-ui的時候肯定會遇到這樣一個問題,就是在你使用級聯(lián)選擇器的回顯問題,下面這篇文章主要給大家介紹了關(guān)于element-ui動態(tài)級聯(lián)選擇器回顯問題的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • vue3中使用reactive定義的變量響應式丟失問題解決方案

    vue3中使用reactive定義的變量響應式丟失問題解決方案

    這篇文章主要介紹了vue3中使用reactive定義的變量響應式丟失問題的具體例子和解決方案,文章通過代碼示例給大家講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06

最新評論