element?table?數(shù)據(jù)量大頁(yè)面卡頓的解決
element table數(shù)據(jù)量大頁(yè)面卡頓
table顯示醫(yī)院列表,這里后臺(tái)未做分頁(yè),總共數(shù)據(jù)大約8000條。
一次性全部賦值給table整個(gè)頁(yè)面都會(huì)卡頓好幾秒。
查看了請(qǐng)求接口到數(shù)據(jù)返回的時(shí)間為192ms,可以接受。
應(yīng)該是頁(yè)面渲染的問(wèn)題。
這邊就在前端做了分頁(yè)處理。
調(diào)用接口
// 獲取醫(yī)院列表 getHospitalList() { this.$api.Hospital.GetHospitalList().then(res => { if (res.status == 200) { this.tableData = res.data.response; this.total = res.data.response.length; } }); }, // 分頁(yè) handleCurrentChange(currentPage) { this.currentPage = currentPage; }, // 搜索 searchList() { let params = ""; switch (this.select) { case "1": if (this.input3) { params = this.input3; this.$api.Hospital.QueryHospitalsByName(params).then(res => { if (res.data.length > 0) { this.tableData = res.data; this.currentPage = 1; this.total = res.data.length; } else { this.$message({ message: "未查詢(xún)到醫(yī)院信息", type: "info" }); } console.log(res); }); } break; case "2": if (this.input3) { params = this.input3; this.$api.Hospital.QueryHospitalsByCode(params).then(res => { if (res.data.length > 0) { this.tableData = res.data; this.currentPage = 1; this.total = res.data.length; } else { this.$message({ message: "未查詢(xún)到醫(yī)院信息", type: "info" }); } console.log(res); }); } break; default: console.log(111); } },
table組件
<el-table :data=" tableData.slice((currentPage - 1) * pageSize, currentPage * pageSize ) " border style="width: 100%" height="400" size="mini" highlight-current-row > …… </el-table> <el-pagination layout="prev, pager, next" background :page-size="pageSize" :total="total" @current-change="handleCurrentChange" > </el-pagination>
data里使用到的數(shù)據(jù)
data(){ return { total: 0, currentPage: 1, pageSize: 50, } }
el-table大數(shù)據(jù)量渲染卡頓的一種思路
現(xiàn)需要呈現(xiàn)一個(gè)表格,有近500行,30多列,使用vue+elementUI呈現(xiàn)。
這個(gè)數(shù)據(jù)量不算大,但可能列數(shù)比較多,渲染時(shí)速度很慢,滾動(dòng)會(huì)有卡頓,使用體驗(yàn)不佳。
但并不想做分頁(yè)處理,想要盡可能接近excel的呈現(xiàn)。
思路
假設(shè)全部數(shù)據(jù)為allData(數(shù)組),現(xiàn)在使用一個(gè)displayData(數(shù)組),displayData = allData.slice(scorll, scorll+ displayCount),scroll表示當(dāng)前滾動(dòng)到的index, displayCount表示要展示的行數(shù)。把displayData設(shè)為el-table的數(shù)據(jù)源,只渲染該部分?jǐn)?shù)據(jù)。通過(guò)對(duì)表格添加滾動(dòng)事件監(jiān)聽(tīng),來(lái)動(dòng)態(tài)更新scroll,并且對(duì)scroll添加watch,當(dāng)scroll發(fā)生變化,就自動(dòng)更新displayData。
滾動(dòng)監(jiān)聽(tīng)
監(jiān)聽(tīng)滾動(dòng)需要考慮到兼容性,火狐是DOMMouseScroll,其他的是mousewheel。
?? ??? ??? ?/*指定table的ref*/ ? ? ? ? ? ? this.table = this.$refs.mytable.bodyWrapper; ?? ??? ??? ? ?? ??? ??? ?/*瀏覽器兼容*/ ? ? ? ? ? ? let userAgent = navigator.userAgent; //取得瀏覽器的userAgent字符串 ? ? ? ? ? ? let ff = userAgent.indexOf("Firefox") > -1; //判斷是否Firefox瀏覽器 ? ? ? ? ? ? ? ? ? ? ? if (ff) { ? ? ? ? ? ? ?this.table.addEventListener('DOMMouseScroll', (event) => { ? ? ? ? ? ? ? ? ? ? let detail = event.detail; ? ? ? ? ? ? ? ? ? ? //滾動(dòng)方向 ? ? ? ? ? ? ? ? ? ? let down = detail > 0; ? ? ? ? ? ? ? ? ? ? /** ? ? ? ? ? ? ? ? ? ? 根據(jù)滾動(dòng)方向和距離修改scroll的值,需要注意scroll的范圍不能越界。 ? ? ? ? ? ? ? ? ? ? **/ ? ? ? ? ? ? ? ? ? ? }); ? ? ? ? ? ? }else{ ? ? ? ? ? ? ? this.table.addEventListener('mousewheel', (event) => { ? ? ? ? ? ? ? ? ? ? let wheel = event.deltaY; ? ? ? ? ? ? ? ? ? ? //滾動(dòng)方向 ? ? ? ? ? ? ? ? ? ? let down = wheel > 0; ? ? ? ? ? ? ? ? ? ? }); ? ? ? ? ? ? }
slider
除了滾動(dòng)表格,還需要一個(gè)模擬滾動(dòng)條。這里選用slider控件,和scroll綁定。
發(fā)現(xiàn)elementUI的slider數(shù)值方向只能從下到上,且不能有太多的定制化。找到另外一個(gè)可深度定制化的vue slider控件:vue-slider-component。通過(guò)參數(shù)配置及css修改使其盡可能像滾動(dòng)條。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue electron前端開(kāi)啟局域網(wǎng)接口實(shí)現(xiàn)流程詳細(xì)介紹
用electron寫(xiě)了一個(gè)自己用的小軟件,無(wú)后端,純本地的數(shù)據(jù)。最近想著開(kāi)發(fā)一個(gè)手機(jī)端app,將PC端的數(shù)據(jù)進(jìn)行同步。為了這小小的功能單獨(dú)寫(xiě)個(gè)后端又麻煩。干脆前后端不分離哈哈,直接在前端軟件中開(kāi)啟接口2022-10-10axios二次封裝的詳細(xì)過(guò)程與跨域問(wèn)題
通常我們的項(xiàng)目會(huì)越做越大,頁(yè)面也會(huì)越來(lái)越多,隨之而來(lái)的是接口數(shù)量的增加,api統(tǒng)一管理,不管接口有多少,所有的接口都可以非常清晰,容易維護(hù),下面這篇文章主要給大家介紹了關(guān)于axios二次封裝的詳細(xì)過(guò)程與跨域問(wèn)題的相關(guān)資料,需要的朋友可以參考下2022-09-09快速了解Vue父子組件傳值以及父調(diào)子方法、子調(diào)父方法
這篇文章主要介紹了Vue父子組件傳值以及父調(diào)子方法、子調(diào)父方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07vue+element的表格實(shí)現(xiàn)批量刪除功能示例代碼
這篇文章主要介紹了vue+element的表格實(shí)現(xiàn)批量刪除功能示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Vue后臺(tái)實(shí)現(xiàn)點(diǎn)擊圖片放大功能的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用Vue實(shí)現(xiàn)點(diǎn)擊圖片放大功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-12-12解決el-date-picker日期選擇控件少一天的問(wèn)題
這篇文章主要介紹了解決el-date-picker日期選擇控件少一天的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue自定義指令用法經(jīng)典實(shí)例小結(jié)
這篇文章主要介紹了vue自定義指令用法,結(jié)合實(shí)例形式總結(jié)分析了vue自定義指令常見(jiàn)寫(xiě)法與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-03-03想到頭禿也想不到的Vue3復(fù)用組件還可以這么hack的用法
這篇文章主要為大家介紹了想到頭禿也想不到的Vue3復(fù)用組件還可以這么hack的用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04