91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue大數據表格卡頓問題的完美解決方案

發布時間:2020-09-15 15:41:09 來源:腳本之家 閱讀:324 作者:楊金凱 欄目:web開發

前言

vue渲染小數據挺快,大數據vue開始出現卡頓現象,本文講給大家詳細介紹關于vue大數據表格卡頓問題的解決方法

點我在線體驗Demo(請用電腦查看)

親測蘋果電腦,chrome瀏覽器無卡頓現象,其它瀏覽器并未測試,如遇到卡頓請備注系統和瀏覽器,方便我后續優化,謝謝

先看一下效果,一共1000 X 100 = 10W個單元格基本感受不到卡頓,而且每個單元格點擊可以編輯,支持固定頭和固定列

項目源代碼地址 Github (本地下載)

解決問題核心點:橫向滾動加載,豎向滾動加載

項目背景

筆者最近在做廣告排期功能,需要進行點位預占,大的合同可能需要對多個資源排期,周期可能到幾年這樣,然后我們的頁面交互是這樣

橫向每個月30個單元格,最多的3年,36個月,每行36*30=1080個單元格

豎向100個資源,總共約️10W個單元格,然后每個單元格里面會有一個輸入框,一個庫存總數,所以總數是20W個,內網使用,接口請求根本不是問題,可以瀏覽器渲染就扛不住了接口回來之后會出現幾十秒的白屏,整個頁面處于卡死狀態

這還不算,加載出之后頁面操作也是非常卡,滑動延遲嚴重,頁面基本處于癱瘓狀態

之前的功能是基于jquery開發的,項目重構用的vue,UI采用了ElementUI,ElmentUI中的表格在數據量較大是有嚴重的性能問題,最直接的表現就是白屏時間較長,而且會出現渲染錯亂

所以就想著自己實現一個表格,解決卡頓問題

實現思路

表格拆分,動態加載

表格橫向按月拆分,每個月份單獨一個table,月份table外層放一個占位div,根據橫向滾動位置控制展示

豎向按資源拆分,同樣包裹一個占位div,按照滾動位置動態加載,始終保持dom數量上線

動態編輯,按需生成編輯輸入框

不同的標簽在瀏覽器渲染時性能是不一樣的,比如input這種標簽就比span等標簽重許多,所以不能滿屏input

方案就是點擊單元格展示輸入框,焦點丟失移除,此處的展示非display控制顯示隱藏,而是v-if控制dom是否加載

代碼分解

固定頭

<div class="table-head">
  <div class="module"
  v-bind: 
  v-for="(item, index) in monthData" v-bind:key="index">
  <table cellspacing="0" cellpadding="0">
  <thead>
  <tr>
   <td colspan="30">{{item.month}}</td>
  </tr>
  <tr>
   <td width="100" 
   v-for="(d_item, d_index) in item.days" v-bind:key="d_index"
   >{{d_item}}</td>
  </tr>
  </thead>
  </table>
  </div>
 </div>

固定列

 <div class="table-fix-cloumns">
  <div class="module fix-left-top">
  <table width="100" cellspacing="0" cellpadding="0">
  <thead>
  <tr>
   <td>位置</td>
  </tr>
  <tr>
   <td>position</td>
  </tr>
  </thead>
  </table>
  </div>
  <div class="module" v-bind:>
  <table width="100" cellspacing="0" cellpadding="0">
  <thead>
  <tr v-for="(item, index) in projectData" v-bind:key="index">
   <td>{{item.name}}</td>
  </tr>
  </thead>
  </table>
  </div>
 </div>

表體

<div class="table-body" @scroll="tableScroll" >
  <div class="module" 
  
  v-for="(item, index) in monthData" v-bind:key="index">
  <div class="content" 
  v-if="Math.abs(index - curModule) < 3">
  <div class="row"
  
  v-for="(p_item, p_index) in projectData" 
  v-bind:key="p_index">
  <table width="3000"
   v-if="Math.abs(p_index - curRow) < 20"
   cellspacing="0" cellpadding="0">
   <tbody>
   <tr>
   <td 
   @click="clickTd(p_index,item.month, d_item, $event)" 
   v-for="(d_item, d_index) in item.days" v-bind:key="d_index">
   <span v-if="!originProjectData[p_index][''+item.month][''+d_item]['show']">{{originProjectData[p_index][''+item.month][''+d_item]['last']}}</span>
   <input
   @blur="blurTd(p_index,item.month, d_item)"
   v-if="originProjectData[p_index][''+item.month][''+d_item]['show']"
   v-model="originProjectData[p_index][''+item.month][''+d_item]['last']"
   v-focus="originProjectData[p_index][''+item.month][''+d_item]['focus']"/>
   </td>
   </tr>
   </tbody>
  </table>
  </div>
  </div>
  </div>
 </div>

經過如上優化,完美解決表格卡頓問題,但是我并沒有封裝組件,原因如下

·插件封裝后會有很多限制,不能再用vue那種模板寫法,用json傳入數據,自定義內容不是很靈活
·可以根據自己的應用場景自行修改拓展,代碼已經很簡潔
·比較懶

如果你有類似需求可以試一下我這個,也歡迎Star

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永兴县| 岳西县| 云梦县| 武清区| 文登市| 绍兴县| 砚山县| 梁河县| 堆龙德庆县| 洛南县| 德化县| 赤峰市| 双峰县| 景东| 台前县| 雷波县| 永丰县| 武隆县| 台东县| 竹山县| 永德县| 玛沁县| 迭部县| 陈巴尔虎旗| 会昌县| 舒城县| 繁昌县| 奉化市| 乌拉特前旗| 乐平市| 高碑店市| 襄汾县| 沙田区| 改则县| 连州市| 泰和县| 南宫市| 施秉县| 信丰县| 平利县| 陵川县|