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

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

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

在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)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

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

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

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

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

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

    Vue.js圖片預(yù)覽插件使用詳解

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

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

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

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

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

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

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

    如何解決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在提示信息中換行問題

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

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

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

    axios在Vue3中的使用實例代碼

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

最新評論

建水县| 广丰县| 武鸣县| 腾冲县| 通河县| 闵行区| 繁峙县| 吴堡县| 石首市| 佳木斯市| 东乌珠穆沁旗| 三亚市| 卓尼县| 宝清县| 漠河县| 江都市| 绍兴县| 苗栗县| 深水埗区| 会泽县| 二连浩特市| 海口市| 河北省| 西藏| 枞阳县| 峡江县| 江阴市| 华安县| 临西县| 云阳县| 金阳县| 平阳县| 杭锦旗| 平阴县| 确山县| 鹤壁市| 鄂伦春自治旗| 莒南县| 梁河县| 乌拉特前旗| 五指山市|