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

在React中實現(xiàn)分塊導(dǎo)出大量數(shù)據(jù)表格并壓縮成圖片的解決方案

 更新時間:2024年12月19日 10:48:06   作者:snakeshe1010  
在現(xiàn)代Web開發(fā)中,處理和展示大量數(shù)據(jù)是一個常見的挑戰(zhàn),特別是在使用React框架時,我們經(jīng)常需要將這些數(shù)據(jù)以表格的形式展示,并提供導(dǎo)出功能,本文將介紹如何在React中實現(xiàn)一個高效、分塊導(dǎo)出大量數(shù)據(jù)表格,并將其壓縮為圖片的解決方案,需要的朋友可以參考下

需求分析

我們的目標是實現(xiàn)一個React組件,該組件能夠:

  • 處理大量數(shù)據(jù)的表格展示。
  • 將表格數(shù)據(jù)分塊導(dǎo)出為圖片。
  • 壓縮導(dǎo)出的圖片以減少文件大小。

實現(xiàn)步驟

1. 獲取表格數(shù)據(jù)

首先,我們需要一個函數(shù)來獲取React表格組件的數(shù)據(jù)源:

const getTableData = (tableElement) => {
  const children = React.Children.only(tableElement.props.children);
  return children.props.dataSource || [];
}

2. 創(chuàng)建帶數(shù)據(jù)的表格實例

接下來,我們需要一個函數(shù)來創(chuàng)建一個新的表格實例,并更新其數(shù)據(jù)源:

const createTableWithData = (element, data) => {
  const tableInstance = React.Children.only(element.props.children);
  return React.cloneElement(tableInstance.props.children, {
    ...tableInstance.props.children.props,
    dataSource: data
  });
}

3. 分塊導(dǎo)出表格

為了處理大量數(shù)據(jù),我們將數(shù)據(jù)分塊,并為每個數(shù)據(jù)塊創(chuàng)建一個表格實例,然后導(dǎo)出為圖片:

const exportTableInChunks = async (element) => {
  const zip = new JSZip();
  const tableElement = element.querySelector('.ant-table-wrapper');
  const allData = getTableData(tableElement);
  const chunkSize = 200;
  const chunks = [];

  for (let i = 0; i < allData.length; i += chunkSize) {
    chunks.push(allData.slice(i, i + chunkSize));
  }

  const exportContainer = document.createElement('div');
  document.body.appendChild(exportContainer);
  const root = createRoot(exportContainer);

  try {
    const batchSize = 3;
    for (let i = 0; i < chunks.length; i += batchSize) {
      const currentBatch = chunks.slice(i, i + batchSize);
      await Promise.all(
        currentBatch.map(async (chunk, batchIndex) => {
          const newTable = createTableWithData(tableElement, chunk);
          root.render(
            <ConfigProvider theme={React.Children.only(children).props.children.props.theme}>
              {newTable}
            </ConfigProvider>
          );

          await new Promise((resolve) => setTimeout(resolve, 2000));

          const png = await exportElementAsPng(exportContainer, `${title}_part${i + batchIndex + 1}`);
          if (png) {
            zip.file(
              `${title}_part${i + batchIndex + 1}.png`,
              png.split('base64,')[1],
              { base64: true }
            );
          }
        })
      );
    }

    const content = await zip.generateAsync({ type: 'blob' });
    saveAs(content, `${title}.zip`);
  } finally {
    root.unmount();
    document.body.removeChild(exportContainer);
    resetExportState();
  }
}

4. 導(dǎo)出操作的觸發(fā)

最后,我們需要一個函數(shù)來觸發(fā)導(dǎo)出操作,并處理錯誤:

const handleExportContent = async (element) => {
  if (!element) {
    console.warn('Export element not found');
    return;
  }

  try {
    const tableData = getTableData(element);
    if (tableData.length > 200) {
      await exportTableInChunks(element);
    } else {
      const res = await exportElementAsPng(element, title, 'single');
      if (!res) {
        throw new Error('Failed to export image');
      }
    }
    resetExportState();
  } catch (error) {
    console.error('Export failed:', error);
    message.error('導(dǎo)出失敗,請重試');
  }
}

5.補充導(dǎo)出圖片的工具方法

  • 需要注意批量導(dǎo)出的需要轉(zhuǎn)成base64然后壓縮,單張的直接走單圖片導(dǎo)出即可
import html2canvas from 'html2canvas'

export const exportElementAsPng = (
  element: HTMLElement,
  fileName: string = 'export',
  type?: string
) => {
  return new Promise((resolve, reject) => {
    // 添加最大尺寸限制
    const maxDimension = 16384 // 大多數(shù)瀏覽器的 Canvas 最大尺寸限制
    const elementRect = element.getBoundingClientRect()
    const scale = Math.min(
      2, // 原來的 2 倍縮放
      maxDimension / elementRect.width,
      maxDimension / elementRect.height
    )

    html2canvas(element, {
      backgroundColor: null,
      scale: scale,
      logging: false,
      useCORS: true, // 允許跨域圖片
      allowTaint: true, // 允許跨域圖片
      windowWidth: element.scrollWidth,
      windowHeight: element.scrollHeight
    })
      .then((canvas) => {
        // 創(chuàng)建下載鏈接
        if(type==='single'){
          const link = document.createElement('a')
          link.download = `${fileName}.png`
          link.href = canvas.toDataURL('image/png')
          link.click()
          resolve(true)
        }else{
          const base64String = canvas.toDataURL(type)
          resolve(base64String)
        }
      })
      .catch((error) => {
        reject(error)
      })
  })
}

結(jié)語

通過上述步驟,我們實現(xiàn)了一個能夠處理React中大量數(shù)據(jù)表格的分塊導(dǎo)出與圖片壓縮的功能。這種方法不僅提高了性能,還優(yōu)化了用戶體驗,使得大量數(shù)據(jù)的導(dǎo)出變得更加高效和實用。

到此這篇關(guān)于在React中實現(xiàn)分塊導(dǎo)出大量數(shù)據(jù)表格并壓縮成圖片的解決方案的文章就介紹到這了,更多相關(guān)React導(dǎo)出數(shù)據(jù)表格并壓縮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決React報錯`value` prop on `input` should not be null

    解決React報錯`value` prop on `input` should&

    這篇文章主要為大家介紹了React報錯`value` prop on `input` should not be null解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • react redux中如何獲取store數(shù)據(jù)并將數(shù)據(jù)渲染出來

    react redux中如何獲取store數(shù)據(jù)并將數(shù)據(jù)渲染出來

    這篇文章主要介紹了react redux中如何獲取store數(shù)據(jù)并將數(shù)據(jù)渲染出來,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • React使用Redux實現(xiàn)組件通信的項目實踐

    React使用Redux實現(xiàn)組件通信的項目實踐

    本文主要介紹了React使用Redux實現(xiàn)組件通信的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-09-09
  • react嵌套路由實現(xiàn)TabBar的實現(xiàn)

    react嵌套路由實現(xiàn)TabBar的實現(xiàn)

    本文主要介紹了react嵌套路由實現(xiàn)TabBar的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • react如何實現(xiàn)篩選條件組件

    react如何實現(xiàn)篩選條件組件

    這篇文章主要介紹了react如何實現(xiàn)篩選條件組件問題,具有很好的參考價價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • React中的axios模塊及使用方法

    React中的axios模塊及使用方法

    axios 是一個基于 promise 的 HTTP 庫,可以用在瀏覽器和 node.js 中,本文給大家分享React中axios模塊的使用方法,感興趣的朋友一起看看吧
    2022-03-03
  • 基于Cloud?Studio構(gòu)建React完成點餐H5頁面(騰訊云?Cloud?Studio?實戰(zhàn)訓(xùn)練營)

    基于Cloud?Studio構(gòu)建React完成點餐H5頁面(騰訊云?Cloud?Studio?實戰(zhàn)訓(xùn)練營)

    最近也是有機會參與到了騰訊云舉辦的騰訊云Cloud Studio實戰(zhàn)訓(xùn)練營,借此了解了騰訊云Cloud?Studio產(chǎn)品,下面就來使用騰訊云Cloud?Studio做一個實戰(zhàn)案例來深入了解該產(chǎn)品的優(yōu)越性吧,感興趣的朋友跟隨小編一起看看吧
    2023-08-08
  • React事件處理過程中傳參的實現(xiàn)方法

    React事件處理過程中傳參的實現(xiàn)方法

    這篇文章主要介紹了React事件處理過程中傳參的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-10-10
  • React?Native?中處理?Android?手機吞字的解決方案

    React?Native?中處理?Android?手機吞字的解決方案

    這篇文章主要介紹了React?Native?中處理?Android?手機吞字的解決方案,作者在 React Native 0.67.4 環(huán)境下,編寫了一個小 demo 來復(fù)現(xiàn)這個問題,需要的朋友可以參考下
    2022-08-08
  • React+Node實現(xiàn)大文件分片上傳、斷點續(xù)傳秒傳思路

    React+Node實現(xiàn)大文件分片上傳、斷點續(xù)傳秒傳思路

    本文主要介紹了React+Node實現(xiàn)大文件分片上傳、斷點續(xù)傳秒傳思路,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02

最新評論

吴江市| 汤原县| 布拖县| 儋州市| 韶山市| 玉山县| 土默特右旗| 双峰县| 朝阳市| 邵阳市| 福建省| 禹州市| 鹤峰县| 前郭尔| 永康市| 武夷山市| 海南省| 潮州市| 长沙市| 鄱阳县| 临漳县| 盐山县| 庆阳市| 于田县| 乌兰察布市| 九寨沟县| 特克斯县| 河北区| 融水| 平陆县| 长春市| 鄢陵县| 乌海市| 张北县| 曲麻莱县| 新龙县| 滨州市| 穆棱市| 平罗县| 鸡东县| 广宗县|