Skip to content

react 的 antd-table 大数据量卡顿优化

需求

原表格数据量大、渲染慢、滚动卡顿;1000 条 30 个数据列的表格会有明显卡顿; 不可抗力不能使用分页,另外有树形和排序的功能。

解决方法

virtuallist-antd: 可以快速地在原代码的基础上实现优化效果,改动较小,表格的扩展功能可以保留;

注意

Table 数据的每一列需要行高相同,组件内部取第一条数据的高度;

example

需要优化的代码

js
import { Table } from 'antd'

<Table
  columns={columns}
  dataSource={dataSource}
  onExpand={this.onExpand}
  expandedRowKeys={expandedRowKeys}
  rowKey={'id'}
  scroll={{ y: '55vh' }}
  pagination={false}
  loading={loading}
/>

安装 virtuallist-antd

BASH
yarn add virtuallist-antd --save

优化后

js
import React, { useMemo } from 'react'
import { Table } from 'antd'
import { VList } from 'virtuallist-antd'

function VisualTable(props) {
  const vc1 = useMemo(() => {
    return VList({
      height: '55vh',
      vid: 'first',
      resetTopWhenDataChange: false, // 当数据改变时是否回滚顶部
    })
  }, [])

  return (
    <>
      <Table
        columns={props.columns}
        dataSource={props.dataSource}
        pagination={props.pagination}
        onExpand={props.onExpand}
        expandedRowKeys={props.expandedRowKeys}
        /** 不建议使用x: max-content. 如果columns有fixed, x为max-content的话. ellipsis会失效 */
        scroll={{ y: '55vh', x: '100%' }}
        loading={props.loading}
        rowKey={props.rowKey}
        components={vc1}
      />
    </>
  )
}

export default VisualTable

问题

原代码较为复杂(繁多且时间上不允许重构),点击展开后会修改 dataSource,为了使点击展开后不回滚顶部,设置了resetTopWhenDataChange: false.

另外有一个很方便的 api,根据需要,可回滚顶部。

js
import { scrollTo } from 'virtuallist-antd'

// 需要的业务逻辑下使用,可回滚顶部;
scrollTo({ row: 1, vid: '相应的vid' })

Released under the MIT License.