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

vue渲染大量數(shù)據(jù)時卡頓卡死解決方法

 更新時間:2022年08月22日 10:22:31   作者:摸魚的圖圖  
這篇文章主要介紹了vue渲染大量數(shù)據(jù)時發(fā)生卡頓卡死問題時的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

1. 問題描述

由于業(yè)務(wù)需求,需要在一個頁面中點擊查詢按鈕時加載出所有的數(shù)據(jù),但數(shù)據(jù)量有近10萬條,渲染出現(xiàn)卡頓,頁面卡死。

2. 常見的解決方案

- 自定義中間層

自定義nodejs中間層,獲取并拆分這10w條數(shù)據(jù),

前端對接nodejs中間層,而不是服務(wù)器

缺點:成本高

- 虛擬列表

只渲染可視區(qū)域DOM,其他隱藏區(qū)域不顯示,只用div撐起高度,隨著瀏覽器滾動,創(chuàng)建和銷毀DOM。

虛擬列表實現(xiàn)起來非常復雜,可借用第三方lib

Vue-virtual-scroll-list

React-virtualiszed

- 前后端配合(本問題解決方案)

前端使用pl-table加載數(shù)據(jù);pl-table(大數(shù)據(jù)表格,完美解決萬級數(shù)據(jù)渲染卡頓問題)

后端循環(huán)獲取數(shù)據(jù),每次只獲取幾百條數(shù)據(jù),獲取后就進行渲染。

3. 解決方案流程圖

使用pl-table + 每次從后端讀取500條數(shù)據(jù)后就渲染 ,渲染完成后如果還有數(shù)據(jù)繼續(xù)獲取數(shù)據(jù)500條并渲染,直至數(shù)據(jù)讀取完成。

流程圖如下圖所示:

1)點擊查詢按鈕

2)判斷是否正在查詢(isSearching)

3)isSearching = true ;正在查詢時判斷是否需要停止,需要停止則查詢結(jié)束;不需要停止則繼續(xù)查詢過程(不需要額外操作)。

4)isSearching = false ;沒有正在查詢,這時需要設(shè)置 isSearching = true;startId = 0 (查詢的開始id);

searchingTaskTag = genUuid()// 隨機數(shù)(用來在前后端傳遞,保證是同一個查詢)

5)調(diào)用中間fn1函數(shù),判斷當前請求數(shù)據(jù)的最大Id是否小于等于0,如果小于等于0 則請求出最大maxId,并設(shè)置endId = startId + step(查詢的結(jié)束Id);

6) 判斷startId <= maxId 為true,則調(diào)用函數(shù)fn2,隨機數(shù)searchingTaskTag請求和響應中攜帶。

7)根據(jù)response.searchingTaskTag === searchingTaskTag 判斷是否是同一個請求,如果是數(shù)據(jù)則累加進去,同時 startId = startId + step;并去調(diào)用步驟5)。

8)判斷startId <= maxId 為false,則結(jié)束查詢。

4. 代碼

查詢方法

//查詢
    handleSearch() {
      //this.isShow = false;
      if (this.isSearching) {
        // 提示用戶是否停止查詢?
        this.$confirm("確認停止查詢?", "提示", {
          type: "warning",
        }).then(() => {
          this.listLoading = false;
          this.searchingTaskTag = "";
          this.isSearching = false;
          this.hardReset = false;
          this.$nextTick(() => {
            this.hardReset = true;
          });
        });
      } else {
        this.isSearching = true;
        this.searchingTaskTag = genUuid();
        this.tableData = [];
        this.startId = 0;
        this.fn1();
      }
    },

中間函數(shù)fn1

    async fn1() {
      let startId = this.startId;
      let endId = this.startId + this.step;
      let param = {
        pageNo: this.page,
        pageSize: this.pageSize,
        startId: startId,
        endId: endId,
        searchingTaskTag: this.searchingTaskTag,
      };
      try {
        if (this.maxId <= 0) {
          let response = await getMaxId();
          this.maxId = response.body;
        }
        if (startId <= this.maxId) {
          this.fn2(param);
        } else {
          this.$message.success("查詢結(jié)束!");
          this.isSearching = false;
        }
      } catch (e) {}
    },
getMaxId() {
      getMaxId()
        .then((resp) => {
          this.maxId = resp.body;
        })
        .catch((error) => {
          this.$message.error(error.body);
        });
    },

fn2 函數(shù)

   //獲取數(shù)據(jù)列表
 fn2(param) {
      fn2(param).then(
      (resp) => {
          let tempList = resp.body.content;
          let echoSearchingTaskTag = resp.body.searchingTaskTag;
          if (
            tempList.length > 0 &&
            this.searchingTaskTag == echoSearchingTaskTag
          ) {
            this.tableData.push(...tempList);
           }
          if (this.searchingTaskTag == echoSearchingTaskTag) {
            this.listLoading = false;
            this.startId += this.step;
            this.fn1();
          }
        })
        .catch((error) => {
          this.listLoading = false;
          this.$message.error("獲取失??!");
          this.isSearching = false;
          this.flag = false;
        });
      this.listLoading = false;
    },

到此這篇關(guān)于vue渲染大量數(shù)據(jù)時卡頓卡死解決方法的文章就介紹到這了,更多相關(guān)vue渲染數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript經(jīng)典案例之簡易計算器

    JavaScript經(jīng)典案例之簡易計算器

    這篇文章主要為大家詳細介紹了JavaScript經(jīng)典案例之簡易計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • 讓FireFox支持innerText的實現(xiàn)代碼

    讓FireFox支持innerText的實現(xiàn)代碼

    DHTML非標準屬性innerText在FireFox中的使用
    2009-12-12
  • 微信小程序上傳圖片到php服務(wù)器的方法

    微信小程序上傳圖片到php服務(wù)器的方法

    這篇文章主要為大家詳細介紹了微信小程序上傳圖片到php服務(wù)器的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • 200行代碼實現(xiàn)blockchain 區(qū)塊鏈實例詳解

    200行代碼實現(xiàn)blockchain 區(qū)塊鏈實例詳解

    這篇文章主要介紹了200行代碼實現(xiàn)blockchain 區(qū)塊鏈的相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2018-03-03
  • 使用JavaScript實現(xiàn)響應式計數(shù)器動畫

    使用JavaScript實現(xiàn)響應式計數(shù)器動畫

    在本文中,我們將學習如何使用?HTML?CSS?和?JavaScript創(chuàng)建響應式計數(shù)器動畫。?我們在很多地方都可以用,比如適用于不同類型的個人網(wǎng)站、企業(yè)網(wǎng)站等,感興趣的可以了解一下
    2022-08-08
  • 詳解tween.js 中文使用指南

    詳解tween.js 中文使用指南

    本篇文章主要介紹了詳解tween.js 中文使用指南,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • javascript實現(xiàn)在下拉列表中顯示多級樹形菜單的方法

    javascript實現(xiàn)在下拉列表中顯示多級樹形菜單的方法

    這篇文章主要介紹了javascript實現(xiàn)在下拉列表中顯示多級樹形菜單的方法,涉及javascript屬性菜單的定義、構(gòu)造及遍歷等技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • js利用reduce方法讓你的代碼更加優(yōu)雅

    js利用reduce方法讓你的代碼更加優(yōu)雅

    一直以來都在函數(shù)式編程的大門之外徘徊,要入門的話首先得熟悉各種高階函數(shù),數(shù)組的reduce方法就是其中之一,這篇文章主要給大家介紹了關(guān)于js利用reduce方法讓你的代碼更加優(yōu)雅的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • 讓Firefox支持event對象實現(xiàn)代碼

    讓Firefox支持event對象實現(xiàn)代碼

    FireFox并沒有 window.event ,所以在FireFox下編寫事件處理函數(shù)是很麻煩的事。如果要得到 event 對象,就必須要聲明時間處理函數(shù)的第一個參數(shù)為event
    2009-11-11
  • JavaScript實現(xiàn)網(wǎng)頁版貪吃蛇游戲

    JavaScript實現(xiàn)網(wǎng)頁版貪吃蛇游戲

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)網(wǎng)頁版貪吃蛇游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論

磴口县| 清水河县| 弋阳县| 重庆市| 石狮市| 清镇市| 碌曲县| 肥东县| 嵊州市| 上栗县| 绥滨县| 长阳| 桦甸市| 衡水市| 皮山县| 九台市| 江达县| 什邡市| 雷波县| 兴业县| 凤阳县| 娱乐| 达州市| 黄浦区| 涞源县| 郴州市| 赞皇县| 长葛市| 南京市| 江达县| 广灵县| 蓝山县| 日喀则市| 沙雅县| 庆安县| 辰溪县| 靖远县| 苍梧县| 屏边| 榕江县| 瑞丽市|