vue 3實現微信式聊天記錄向上滾動加載:保持滾動位置
開發類似微信聊天記錄的應用時,需要在用戶向上滾動到頂部時加載更多歷史消息,同時保持滾動條位置不變。本文演示如何使用Vue 3實現此功能。
原始代碼結構及問題:
以下代碼展示了基本的向上滾動加載,但加載新消息后,滾動條會回到頂部:
<template> <div id="app"> <div class="container" ref="chatlistref" @scroll="handleScroll"> <ul> <li v-for="item in msgs" :key="item">{{ item }}</li> </ul> </div> </div> </template> <script> import { createApp, ref, onMounted, nextTick } from 'vue'; const generateNumbers = (start, end) => { // ... (same as before) ... }; const app = createApp({ setup() { const msgs = ref(generateNumbers(1, 200)); const chatlistref = ref(null); const scrollToBottom = async () => { const chatListElement = chatlistref.value; if (chatListElement) { chatListElement.scrollTop = chatListElement.scrollHeight; } }; const handleScroll = (ev) => { const target = ev.target; if (target.scrollTop === 0) { msgs.value.unshift(...generateNumbers(201, 400)); // 問題:此處加載新數據后,滾動條會回到頂部 } }; onMounted(() => { scrollToBottom(); }); return { msgs, chatlistref, handleScroll }; } }); app.mount('#app'); </script> <style scoped> /* ... (same as before) ... */ </style>
改進后的handleScroll函數:
立即學習“前端免費學習筆記(深入)”;
為了解決滾動條回到頂部的問題,我們需要在加載新數據后,計算滾動條應該移動的距離,并將其設置回正確的位置。修改后的handleScroll函數如下:
const handleScroll = (ev) => { const target = ev.target; if (target.scrollTop === 0) { const scrollHeightBefore = target.scrollHeight; msgs.value.unshift(...generateNumbers(201, 400)); nextTick(() => { const scrollHeightAfter = target.scrollHeight; target.scrollTop = scrollHeightAfter - scrollHeightBefore; }); } };
關鍵在于:
- 在添加新數據前記錄scrollHeight。
- 使用nextTick確保dom更新后,再計算滾動條需要移動的距離(scrollHeightAfter – scrollHeightBefore)。
- 將scrollTop設置為計算出的距離,保持滾動條在加載新數據后的相對位置。
通過這個改進,Vue 3應用就能實現類似微信聊天記錄的向上滾動加載功能,并在加載更多消息后保持滾動條在相同相對位置,提供更流暢的用戶體驗。 記住在你的css中添加必要的樣式來確保容器有垂直滾動條 (overflow-y: auto;)。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦