短影片app原始碼,Vue3滾動載入
短影片app原始碼,Vue3滾動載入
Hooks useLazyLoad
interface UseLazyLoadQo<T> { className: string; // 監聽的dom的class calcBottomCount: number; // 計算滾動到table底部的次數 data: T[]; // 資料 getData: () => void | Promise<void>; // 獲取資料的方法 } interface UseLazyLoadVo<T> { updateData?: (nextData: T[]) => void; } export const useLazyLoad = <T>(params: UseLazyLoadQo<T>): UseLazyLoadVo<T> => { try { const { className, data, getData, calcBottomCount } = params || {}; let list = data; let oldScrollTop = 0; // 記錄上一次滾動的位置 let listenDom; onMounted(() => { listenDom = document.getElementsByClassName(className)[0]; console.log("mounted", listenDom); listenDom?.addEventListener("scroll", listenScroll); }); const updateData = (nextData: T[]): void => { list = nextData; }; const listenScroll = (e: Event): void => { if (calcBottomCount === 1 && !list.length) return; const target = e.target as EventTarget & HTMLDivElement; // js有精度問題,所以要向上取整 const scrollTop = Math.ceil(target?.scrollTop); // 距頂部距離 const clientHeight = Math.ceil(target?.clientHeight); // 可視區高度 const scrollHeight = Math.ceil(target?.scrollHeight); // 捲軸總高度 // 考慮到滾動的位置一般可能會大於一點可滾動的高度,所以這裡不能用等於 // 對比oldScrollTop 與 scrollTop的值,如果相等,說明捲軸沒有滾動,直接return // console.log('scrollTop', scrollTop, 'clientHeight', clientHeight, 'scrollHeight', scrollHeight); if (oldScrollTop === scrollTop) return; oldScrollTop = scrollTop; if (scrollTop && scrollTop + clientHeight >= scrollHeight) { getData && getData(); } }; onUnmounted(() => { removeEventListener("scroll", listenScroll); }); return { updateData, // 更新資料 }; } catch (error) { console.error(error); return { updateData: undefined, }; } };
使用:
interface MyState { appData: any[]; } const state = reactive<MyState>({ appData: [], }); let calcBottomCount = 1; // 計算滾動到table底部的次數(滾動到底部加 1 如果沒有資料 就不賦值) const params = { className: 'app-wrap_view', data: state.appData, getData: getData, calcBottomCount, }; const { updateData } = useLazyLoad<pageListVO>(params); watch( () => state.appData, () => { // 由於 useLazyLoad 無法監聽資料變化,所以需在watch中呼叫函式 updateData && updateData(state.appData); } ); const getData = async (): Promise<void> => { try { const params: pageListQO = { current: calcBottomCount, productName: '', size: 20, }; state.loading = true; const res = await xxApi(params); state.loading = false; const { code } = res || {}; if (code !== RES_CODE.SUCCESS) return; const { list } = res.data || {}; if (!list.length && calcBottomCount > 1) { message.warning('沒有更多資料了'); return; } calcBottomCount++; state.appData.push(...(list || [])); } catch (error) { state.loading = false; console.error(error); } };
以上就是短影片app原始碼,Vue3滾動載入, 更多內容歡迎關注之後的文章
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69978258/viewspace-2993081/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 移動短影片直播開發,短影片原始碼搭建社交平臺原生APP原始碼APP
- 短影片app原始碼,日常開發之RecycleView滑動APP原始碼View
- 影片直播app原始碼,純css實現橫向滾動APP原始碼CSS
- 影片直播app原始碼,vue實現列表自動滾動的方式APP原始碼Vue
- 短影片app原始碼,自動捲軸擋住 div內容APP原始碼
- 影片直播app原始碼,css預載入旋轉動畫與流光字型APP原始碼CSS動畫
- 短影片app原始碼,自定義快速捲軸FastScrollBarAPP原始碼AST
- 短影片app原始碼,藉助輪詢最佳化互動體驗APP原始碼
- 短影片APP系統原始碼,定製開發功能APP原始碼
- 短影片的“火”,離不開短影片app原始碼的這三個核心功能APP原始碼
- 線上直播系統原始碼,實現翻頁載入、下拉滾動載入原始碼
- app直播原始碼,等待時的載入動畫(交錯載入動畫)APP原始碼動畫
- 短影片php原始碼,如何實現關鍵資源的預載入?PHP原始碼
- 短影片app原始碼,Flutter元件--搜尋頁面佈局APP原始碼Flutter元件
- 短影片APP無加密原始碼,支援二次開發APP加密原始碼
- 短影片app原始碼,圖形和簡訊驗證碼的自動識別獲取APP原始碼
- android短影片開發,圖片視差滾動Android
- 影片直播原始碼,載入gif圖片原始碼
- 直播app原始碼開源,Android 滾動的公告欄APP原始碼Android
- php短視訊原始碼,vue遞迴動態載入選單PHP原始碼Vue遞迴
- 短影片app原始碼,Android TextView文字,刪除線以及下劃線APP原始碼AndroidTextView
- 短影片app原始碼,實現冪等設計的常見方式APP原始碼
- 直播app原始碼,應用elementPlus table並滾動顯示APP原始碼
- 短影片程式原始碼,如何實現短影片的熱門頁面原始碼
- 影片直播網站原始碼,flutter 頂部滾動欄頁面網站原始碼Flutter
- 短影片平臺原始碼,利用mq限制入庫併發數原始碼MQ
- 直播app系統原始碼,css優化滾動條樣式APP原始碼CSS優化
- 短視訊直播原始碼,滾動定位,規定每次滑動時下滑多少格原始碼
- 婚戀交友原始碼開發,移動端滾動載入更多元件的實現原始碼元件
- app直播原始碼,css預載入旋轉動畫 與 流光字型APP原始碼CSS動畫
- 短影片直播APP系統:成品原始碼開發快速搭建部署平臺APP原始碼
- 短影片程式原始碼,怎麼進行短影片稽核機制的架構原始碼架構
- 再看 Composer 自動載入原始碼原始碼
- Composer 自動載入原始碼解析原始碼
- 短視訊帶貨原始碼,更改滾動條跟隨手機滑動的速度原始碼
- 滾動載入圖片(懶載入)實現原理
- 短影片+直播 原生APP成品全套原始碼支援定製和二次開發APP原始碼
- 影片直播app原始碼,自定義View 線型EditText輸入框APP原始碼View