最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue大數(shù)據(jù)表格卡頓問題的完美解決方案

 更新時間:2019年03月20日 14:45:31   作者:楊金凱  
這篇文章主要給大家介紹了基于vue大數(shù)據(jù)表格卡頓問題的完美解決方案,文中通過示例代碼介紹的非常詳細,對大家學習或者使用vue具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧

前言

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

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

親測蘋果電腦,chrome瀏覽器無卡頓現(xiàn)象,其它瀏覽器并未測試,如遇到卡頓請備注系統(tǒng)和瀏覽器,方便我后續(xù)優(yōu)化,謝謝

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

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

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

項目背景

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

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

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

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

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

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

實現(xiàn)思路

表格拆分,動態(tài)加載

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

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

動態(tài)編輯,按需生成編輯輸入框

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

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

代碼分解

固定頭

<div class="table-head">
  <div class="module"
  v-bind:style="{ transform: 'translateX(' + scrollLeft + 'px)' }" 
  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"
   style="min-width:100px">{{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:style="{ transform: 'translateY(' + scrollTop + 'px)' }">
  <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" style="height: 300px">
  <div class="module" 
  style="width:3000px;"
  v-for="(item, index) in monthData" v-bind:key="index">
  <div class="content" 
  v-if="Math.abs(index - curModule) < 3">
  <div class="row"
  style="height:30px"
  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>

經(jīng)過如上優(yōu)化,完美解決表格卡頓問題,但是我并沒有封裝組件,原因如下

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

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

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。

相關文章

  • vue子頁面控制父頁面刷新問題

    vue子頁面控制父頁面刷新問題

    這篇文章主要介紹了vue子頁面控制父頁面刷新問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Vue中@change、@input和@blur的區(qū)別及@keyup介紹

    Vue中@change、@input和@blur的區(qū)別及@keyup介紹

    這篇文章主要給大家介紹了關于Vue中@change、@input和@blur的區(qū)別及@keyup介紹的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-02-02
  • vue實現(xiàn)文字轉語音功能詳解

    vue實現(xiàn)文字轉語音功能詳解

    這篇文章主要介紹了vue實現(xiàn)文字轉語音功能詳解的相關資料,需要的朋友可以參考下
    2022-09-09
  • 詳解vue-amap引入高德JS API的原理

    詳解vue-amap引入高德JS API的原理

    vue-amap是對高德地圖JS API進行封裝的、適用于vue項目的地圖組件庫,本文主要介紹了vue-amap引入高德JS API的原理,具有一定的參考價值,感興趣的可以了解一下
    2022-06-06
  • 深入理解Vue父子組件生命周期執(zhí)行順序及鉤子函數(shù)

    深入理解Vue父子組件生命周期執(zhí)行順序及鉤子函數(shù)

    本文通過實例代碼給大家介紹了Vue父子組件生命周期執(zhí)行順序及鉤子函數(shù)的相關知識,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-08-08
  • Vue-cli項目部署到Nginx服務器的方法

    Vue-cli項目部署到Nginx服務器的方法

    這篇文章主要介紹了Vue-cli項目部署到Nginx服務器的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-11-11
  • 淺談vue websocket nodeJS 進行實時通信踩到的坑

    淺談vue websocket nodeJS 進行實時通信踩到的坑

    這篇文章主要介紹了淺談vue websocket nodeJS 進行實時通信踩到的坑,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue監(jiān)聽瀏覽器網(wǎng)頁關閉和網(wǎng)頁刷新事件代碼示例

    vue監(jiān)聽瀏覽器網(wǎng)頁關閉和網(wǎng)頁刷新事件代碼示例

    在前端開發(fā)中我們通常會遇到這樣的需求,用戶離開、刷新頁面前,修改數(shù)據(jù)未進行保存操作,需要提示框提醒用戶,這篇文章主要給大家介紹了關于vue監(jiān)聽瀏覽器網(wǎng)頁關閉和網(wǎng)頁刷新事件的相關資料,需要的朋友可以參考下
    2023-08-08
  • VUE引入DataV報錯解決實戰(zhàn)記錄

    VUE引入DataV報錯解決實戰(zhàn)記錄

    在使用vue開發(fā)大屏時,發(fā)現(xiàn)了一個很好用的可視化組件庫DataV,下面這篇文章主要給大家介紹了關于VUE引入DataV報錯解決的實戰(zhàn)記錄,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • Vue組織架構樹圖組件vue-org-tree的使用解析

    Vue組織架構樹圖組件vue-org-tree的使用解析

    這篇文章主要介紹了Vue組織架構樹圖組件vue-org-tree的使用解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評論

襄汾县| 伊宁县| 冕宁县| 东城区| 星子县| 九龙坡区| 鹿邑县| 乌鲁木齐县| 司法| 固镇县| 文水县| 云安县| 谢通门县| 酒泉市| 阿拉善盟| 冀州市| 兴业县| 民权县| 九江市| 合川市| 榕江县| 乌兰察布市| 太白县| 连城县| 福海县| 德兴市| 大足县| 老河口市| 柏乡县| 饶平县| 阿合奇县| 涞水县| 仪陇县| 革吉县| 崇信县| 和政县| 米林县| 十堰市| 安龙县| 揭东县| 万全县|