antdv的table因數(shù)據(jù)量過大導(dǎo)致的卡頓問題及解決
遇到的問題
antdv的table表格使用時(shí)因數(shù)據(jù)量過大,造成標(biāo)簽頁切換卡頓的問題
解決辦法
綁定滾動(dòng)事件,頁面只顯示在可視區(qū)域內(nèi)的數(shù)據(jù),沒在可視區(qū)域內(nèi)的數(shù)據(jù)不予展示,dom元素的scrollHeight和offsetHeight和scrollTop三個(gè)值的比較,判斷是否滑到底部了或者頂部了,滑到底部或頂部之后,用scrollTo函數(shù)改變滾動(dòng)條的位置,使其可以再次觸發(fā)滑到頂部或底部,用計(jì)數(shù)count,下滾一下count++,上滾一下count–,用count來從原數(shù)據(jù)里slice哪20條數(shù)據(jù)展示
上代碼
mounted () { document.querySelector('#test table').addEventListener('scroll', this.handleScroll) // 給dom元素綁定scroll事件,可以在mounted的時(shí)候就給他綁定 }, methods: { handleScroll (e) { this.scrollTop = e.target.scrollTop this.offsetHeight = e.target.offsetHeight this.scrollHeight = e.target.scrollHeight // 不足20條數(shù)據(jù),就都展示了就好 if (this.data.length < 20) { this.dataScroll= this.data // 滑到頂部也是給個(gè)提示 if (this.scrollTop === 0) { this.$message.warn('您已經(jīng)滑到頂部了') } // 滑到底部還是給個(gè)提示 if ((this.scrollTop + this.offsetHeight) >= this.scrollHeight) { this.$message.warn('沒有更多數(shù)據(jù)了') } return } // 滑到頂部scrollTop為0 if (this.scrollTop === 0) { this.selectedRowKeys = [] // 計(jì)數(shù)變?yōu)?,即如果是1就代表滑到頂部了,取0-20條數(shù)的告警在可視區(qū)域 let scrollCountTop = this.scrollCount if (this.scrollCount <= 0) { this.scrollCount = 1 } if (this.scrollCount === 1) { this.datascroll= this.data.slice(0, this.numberMaxOverView) // this.numberMaxOverView是要在這一頁展示的數(shù)據(jù)條數(shù) this.$message.warn('您已經(jīng)滑到頂部了') } else { // 如果不是在頂部,根據(jù)計(jì)數(shù)計(jì)算展示哪20條數(shù)據(jù),同時(shí)上滑要將計(jì)數(shù)減一,將滑條改變位置為了觸發(fā)下一次到頂部的計(jì)算 document.querySelector('#test .test').scrollTo(0, 10) this.datascroll= this.data.slice(((this.numberMaxOverView * (scrollCountTop - 1) - this.cacheNum)), (this.numberMaxOverView * scrollCountTop)) this.scrollCount-- } } // 滑到底部 if ((this.scrollTop + this.offsetHeight) >= this.scrollHeight) { this.selectedRowKeys = [] // 如果是最后一次數(shù)據(jù)展示,計(jì)算需要展示的條數(shù) let scrollCount = this.scrollCount let isLastPage = this.numberMaxOverView - (this.data.length - this.scrollCount * (this.datascroll.length - this.cacheNum)) let lastNum = this.scrollCount * (this.data.length - this.cacheNum) - isLastPage if (isLastPage >= 0) { this.datascroll= this.data.slice(lastNum - this.cacheNum, this.data.length) this.$message.warn('沒有更多數(shù)據(jù)了') } else { // 如果不是最后一次,根據(jù)計(jì)數(shù)計(jì)算展示哪20條數(shù)據(jù),同時(shí)下滑要將計(jì)數(shù)加一,將滑條改變位置為了觸發(fā)下一次底部計(jì)算 document.querySelector('#test.demo').scrollTo(0, 100) // 如果是第一次下滑計(jì)算緩存不能再是觸頂?shù)?,可以是計(jì)算緩存往上10條 if ((this.numberMaxOverView * scrollCount - this.cacheNum) < 0) { this.datascroll= this.data.slice((this.numberMaxOverView - this.cacheNum), (this.numberMaxOverView * 2)) this.scrollCount++ } else { this.datascroll= this.data.slice((this.numberMaxOverView * scrollCount - this.cacheNum), (this.numberMaxOverView * (scrollCount + 1))) this.scrollCount++ } } } }
注意
addeventlistener沒辦法綁定上handlescroll事件,
原因目前碰到的有二:
- 一是你queryselector的時(shí)候沒找到元素,如果是組件的話去控制臺(tái)看一下元素的class有沒有綁正確,再不然就給個(gè)你要綁定的id,在它下邊找一找,總之你的dom要綁對(duì);
- 二是你用的組件是否需要給定scrollxy的屬性才能綁定scroll事件
可以參考antdv它的list滾動(dòng)無限加載的思想,如果無需其他操作只是一個(gè)list的話也可以用虛擬滾動(dòng)的組件實(shí)現(xiàn)vue-virtual-scroller
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue實(shí)現(xiàn)調(diào)用PC端攝像頭實(shí)時(shí)拍照
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)調(diào)用PC端攝像頭實(shí)時(shí)拍照,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09vue/react項(xiàng)目刷新頁面出現(xiàn)404報(bào)錯(cuò)的原因及解決辦法
Vue項(xiàng)目打包部署到線上后,刷新頁面會(huì)提示404,下面這篇文章主要給大家介紹了關(guān)于vue/react項(xiàng)目刷新頁面出現(xiàn)404報(bào)錯(cuò)的原因及解決辦法,文中將解決的辦法介紹的很詳細(xì),需要的朋友可以參考下2023-05-05vue watch監(jiān)聽取不到this指向的數(shù)問題
這篇文章主要介紹了vue watch監(jiān)聽取不到this指向的數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-09-09Vue router動(dòng)態(tài)路由實(shí)現(xiàn)過程
Vue動(dòng)態(tài)路由(約定路由),聽起來好像很玄乎的樣子,但是你要是理解了實(shí)現(xiàn)思路,你會(huì)發(fā)現(xiàn)沒有想象中的那么難,下面這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)動(dòng)態(tài)路由添加功能的簡(jiǎn)單方法,需要的朋友可以參考下2023-03-03解決Can''t find variable: SockJS vue項(xiàng)目的問題
這篇文章主要介紹了解決Can't find variable: SockJS vue項(xiàng)目的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09vue-print-nb解決vue打印問題,并且隱藏頁眉頁腳方式
這篇文章主要介紹了vue-print-nb解決vue打印問題,并且隱藏頁眉頁腳方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05