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

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

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

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

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>緩存的組件激活時調用,用于恢復滾動位置
  • onBeforeRouteLeave: 在路由離開之前調用,用于保存當前滾動位置

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([...]) // 產品列表數(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>生效,需要在路由配置和組件渲染中做相應設置:

// 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);
        }
    });
}

到此這篇關于Vue頁面返回滾動位置恢復(keep-alive滾動記憶)的文章就介紹到這了,更多相關Vue 滾動位置恢復內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • vue項目中使用axios遇到的相對路徑和絕對路徑問題

    vue項目中使用axios遇到的相對路徑和絕對路徑問題

    這篇文章主要介紹了vue項目中使用axios遇到的相對路徑和絕對路徑問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • vue修改打包配置如何實現(xiàn)代碼打包后的自定義命名

    vue修改打包配置如何實現(xiàn)代碼打包后的自定義命名

    這篇文章主要介紹了vue修改打包配置如何實現(xiàn)代碼打包后的自定義命名,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Vue.js圖片預覽插件使用詳解

    Vue.js圖片預覽插件使用詳解

    Vue是一套用于構建用戶界面的漸進式框架。這篇文章主要介紹了Vue.js圖片預覽插件的相關知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • vue.js的簡單自動求和計算實例

    vue.js的簡單自動求和計算實例

    今天小編就為大家分享一篇vue.js的簡單自動求和計算實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • vue+vant實現(xiàn)購物車全選和反選功能

    vue+vant實現(xiàn)購物車全選和反選功能

    這篇文章主要為大家詳細介紹了vue+vant實現(xiàn)購物車全選和反選功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Vue監(jiān)聽滾動實現(xiàn)錨點定位(雙向)示例

    Vue監(jiān)聽滾動實現(xiàn)錨點定位(雙向)示例

    今天小編大家分享一篇Vue監(jiān)聽滾動實現(xiàn)錨點定位(雙向)示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 如何解決elementUI打包上線后icon圖標偶爾亂碼問題

    如何解決elementUI打包上線后icon圖標偶爾亂碼問題

    文章描述了在使用若依框架開發(fā)過程中遇到的圖標亂碼問題,通過分析發(fā)現(xiàn)是由于sass編譯器將Unicode編碼轉換為明文導致的,文章提供了四種處理方法:使用css-unicode-loader、升高sass版本、替換element-ui的樣式文件和更換打包壓縮方式
    2025-01-01
  • Vue 解決在element中使用$notify在提示信息中換行問題

    Vue 解決在element中使用$notify在提示信息中換行問題

    這篇文章主要介紹了Vue 解決在element中使用$notify在提示信息中換行問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • vue實現(xiàn)商品列表的無限加載思路和步驟詳解

    vue實現(xiàn)商品列表的無限加載思路和步驟詳解

    這篇文章主要介紹了vue實現(xiàn)商品列表的無限加載思路和步驟詳解,基礎思路是觸底條件滿足之后 page++,拉取下一頁數(shù)據(jù),結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下,
    2024-06-06
  • axios在Vue3中的使用實例代碼

    axios在Vue3中的使用實例代碼

    Axios是一個基于Promise的HTTP客戶端,用于瀏覽器和Node.js,這篇文章主要介紹了axios在Vue3中的使用,需要的朋友可以參考下
    2023-07-07

最新評論

岳西县| 武穴市| 海原县| 隆子县| 沙田区| 郸城县| 耒阳市| 文山县| 龙岩市| 石嘴山市| 石首市| 柳州市| 慈溪市| 万年县| 黎平县| 山东| 贡嘎县| 儋州市| 新河县| 保亭| 出国| 滨州市| 吴川市| 营山县| 裕民县| 景泰县| 息烽县| 灵寿县| 宣城市| 通山县| 夏津县| 芜湖市| 武安市| 迁西县| 平罗县| 静乐县| 浪卡子县| 万安县| 涟源市| 卓尼县| 旬阳县|