日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 Vue 正文

element?table?數據量大頁面卡頓的解決_vue.js

作者:狗狗狗狗亮 ? 更新時間: 2022-04-06 Vue

element table數據量大頁面卡頓

table顯示醫院列表,這里后臺未做分頁,總共數據大約8000條。

一次性全部賦值給table整個頁面都會卡頓好幾秒。

查看了請求接口到數據返回的時間為192ms,可以接受。

在這里插入圖片描述

應該是頁面渲染的問題。

這邊就在前端做了分頁處理。

調用接口

 // 獲取醫院列表
    getHospitalList() {
      this.$api.Hospital.GetHospitalList().then(res => {
        if (res.status == 200) {
          this.tableData = res.data.response;
          this.total = res.data.response.length;
        }
      });
    },
  // 分頁
  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: "未查詢到醫院信息",
               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: "未查詢到醫院信息",
               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里使用到的數據

data(){
	return {
		total: 0,
		currentPage: 1,
        pageSize: 50,
	}
}
		

在這里插入圖片描述

el-table大數據量渲染卡頓的一種思路

現需要呈現一個表格,有近500行,30多列,使用vue+elementUI呈現。

這個數據量不算大,但可能列數比較多,渲染時速度很慢,滾動會有卡頓,使用體驗不佳。

但并不想做分頁處理,想要盡可能接近excel的呈現。

思路

假設全部數據為allData(數組),現在使用一個displayData(數組),displayData = allData.slice(scorll, scorll+ displayCount),scroll表示當前滾動到的index, displayCount表示要展示的行數。把displayData設為el-table的數據源,只渲染該部分數據。通過對表格添加滾動事件監聽,來動態更新scroll,并且對scroll添加watch,當scroll發生變化,就自動更新displayData。

滾動監聽

監聽滾動需要考慮到兼容性,火狐是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;
? ? ? ? ? ? ? ? ? ? //滾動方向
? ? ? ? ? ? ? ? ? ? let down = detail > 0;
? ? ? ? ? ? ? ? ? ? /**
? ? ? ? ? ? ? ? ? ? 根據滾動方向和距離修改scroll的值,需要注意scroll的范圍不能越界。
? ? ? ? ? ? ? ? ? ? **/
? ? ? ? ? ? ? ? ? ? });
? ? ? ? ? ? }else{
? ? ? ? ? ? ? this.table.addEventListener('mousewheel', (event) => {
? ? ? ? ? ? ? ? ? ? let wheel = event.deltaY;
? ? ? ? ? ? ? ? ? ? //滾動方向
? ? ? ? ? ? ? ? ? ? let down = wheel > 0;
? ? ? ? ? ? ? ? ? ? });
? ? ? ? ? ? }

slider

除了滾動表格,還需要一個模擬滾動條。這里選用slider控件,和scroll綁定。

發現elementUI的slider數值方向只能從下到上,且不能有太多的定制化。找到另外一個可深度定制化的vue slider控件:vue-slider-component。通過參數配置及css修改使其盡可能像滾動條。

在這里插入圖片描述

原文鏈接:https://blog.csdn.net/weixin_44046951/article/details/110821148

欄目分類
最近更新