vue.JS模擬微信聊天記錄滾動(dòng)加載效果
本文演示如何在Vue.js應(yīng)用中實(shí)現(xiàn)類似微信聊天記錄的滾動(dòng)加載效果。當(dāng)用戶滾動(dòng)到頂部時(shí),加載更多聊天記錄,并保持滾動(dòng)條在當(dāng)前位置,而非回到頂部。
以下代碼提供了一個(gè)完整的實(shí)現(xiàn)方案:
<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 { ref, onMounted, nextTick } from 'vue'; export default { setup() { const msgs = ref([...generateNumbers(1, 200)]); // 初始數(shù)據(jù) const chatListRef = ref(null); const generateNumbers = (start, end) => { // 生成數(shù)字序列,此處可替換為實(shí)際數(shù)據(jù)加載邏輯 const numbers = []; for (let i = start; i <= end; i++) { numbers.push(i); } return numbers; }; const scrollToBottom = async () => { await nextTick(); // 確保dom更新完畢 chatListRef.value.scrollTop = chatListRef.value.scrollHeight; }; const handleScroll = () => { const container = chatListRef.value; if (container.scrollTop === 0) { const prevScrollHeight = container.scrollHeight; const newMsgs = generateNumbers(msgs.value.length + 1, msgs.value.length + 100); // 加載更多數(shù)據(jù) msgs.value = [...newMsgs, ...msgs.value]; // 將新數(shù)據(jù)添加到數(shù)組頭部 nextTick(() => { container.scrollTop = container.scrollHeight - prevScrollHeight; }); } }; onMounted(() => { scrollToBottom(); }); return { msgs, chatListRef, handleScroll }; }, }; </script> <style scoped> * { margin: 0; padding: 0; } html, body { height: 100vh; background-color: #e9f5f8; } .container { width: 200px; height: 500px; overflow-y: auto; background-color: #fff; } </style>
代碼的關(guān)鍵在于handleScroll函數(shù):它監(jiān)聽(tīng)滾動(dòng)事件,當(dāng)滾動(dòng)條到達(dá)頂部 (container.scrollTop === 0) 時(shí),加載新數(shù)據(jù),并使用nextTick確保DOM更新后,重新計(jì)算滾動(dòng)條位置,從而保持滾動(dòng)條在原位置。 generateNumbers 函數(shù)是一個(gè)占位符,需要替換成你的實(shí)際數(shù)據(jù)加載邏輯(例如,從API獲取數(shù)據(jù))。 scrollToBottom 函數(shù)在組件掛載后將滾動(dòng)條滾動(dòng)到底部。
這個(gè)改進(jìn)后的版本更加簡(jiǎn)潔,并使用了onMounted生命周期鉤子函數(shù)來(lái)初始化滾動(dòng)條位置,提高了代碼的可讀性和可維護(hù)性。 記住替換generateNumbers函數(shù)為你的實(shí)際數(shù)據(jù)獲取方法。
立即學(xué)習(xí)“前端免費(fèi)學(xué)習(xí)筆記(深入)”;