js大数据渲染总结

本文探讨了在渲染大量数据时导致页面卡顿的问题,并提出了解决方案——分批渲染。通过设置每批渲染数量、计算总页数和使用requestAnimationFrame,实现了平滑的批量数据加载,有效避免了浏览器白屏和卡顿现象,提高了用户体验。

十万条大数据渲染优化

window.onload = () => {
    let now = Date.now();
    let ulDom = document.querySelector('ul')
    let data = 100000
    for(var i=0;i<data;i++){
        let li = document.createElement('li')
        li.innerHTML = `我是第${i}个子节点`
        ulDom.append(li)
    }
}

在这里插入图片描述
未经过任何优化打开页面会渲染十万条数据,会白屏卡顿一秒半。

改用分批渲染加载

	let now = Date.now();
    let ulDom = document.querySelector('ul')
    let data = 100000
    let currentNode = 1,currenPage = 1;
    let pageSize = 50
    let totalPage = Math.ceil(data/pageSize)
    function initData () {
        if(currenPage>totalPage) {
            return
        }
        let block = document.createDocumentFragment()
        for(var i=0;i<pageSize;i++){
            let li = document.createElement('li')
            li.innerHTML = `我是第${currentNode}个子节点`
            block.append(li)
            currentNode+=1
        }
        ulDom.append(block)
        currenPage+=1
        window.requestAnimationFrame(initData)
    }
    initData()

首先确定批次渲染,每次渲染的个数,然后再求出总共要渲染多少次,然后递归循环渲染,创建虚拟dom,把要append的元素暂时收集起来,每次循环结束再统一一次插入到dom里面,减少dom插入次数,最后借助requestAnimationFrame方法,每次刷新屏幕的时候插入数据。

### Ant Design 表格组件在处理大数据时的优化方法 #### 数据分页加载 对于大型数据集,一次性渲染全部数据会显著影响性能。采用分页机制可以有效减少每次请求的数据量,从而提高页面响应速度和用户体验[^1]。 ```javascript const [dataSource, setDataSource] = useState([]); const [pagination, setPagination] = useState({ current: 1, pageSize: 10, }); useEffect(() => { fetch(`https://api.example.com/data?page=${pagination.current}&size=${pagination.pageSize}`) .then(response => response.json()) .then(data => setDataSource(data.items)); }, [pagination]); return ( <Table dataSource={dataSource} pagination={{ ...pagination, onChange(page) { setPagination({ ...pagination, current: page }); }, }} /> ); ``` #### 虚拟滚动条(Virtualized Scroll) 当表格行数非常多时,虚拟列表技术只渲染可见区域内的DOM节点,极大地减少了浏览器需要处理的元素数量,提升了整体效率[^3]。 ```javascript import InfiniteScroll from 'react-infinite-scroll-component'; <InfiniteScroll dataLength={items.length} next={() => loadMore()} hasMore={true} > <Table scroll={{ y: 400 }} // 设置固定高度并启用纵向滚动 loading={loading} rowKey="id" columns={columns} dataSource={visibleItems} /> </InfiniteScroll> ``` #### 延迟加载列定义 如果某些复杂计算仅用于特定视图,则可以在实际需要之前延迟这些操作直到用户交互触发它们为止。这有助于降低初始加载时间,并使界面更加流畅[^2]。 ```javascript function getColumns() { const baseColumns = [ { title: 'Name', dataIndex: 'name' }, { title: 'Age', dataIndex: 'age' } ]; if (showExtraInfo) { return [...baseColumns, { title: 'Address', dataIndex: 'address' }]; } return baseColumns; } // Only compute extra column when necessary const columns = useMemo(getColumns, [showExtraInfo]); ``` #### 减少不必要的重绘 通过合理设置`key`属性来帮助React识别哪些元素发生了变化;利用`shouldComponentUpdate()`生命周期函数阻止不必要更新;或者借助于更高级别的抽象如`React.memo()`或`PureComponent`类实现浅比较优化[^4]。 ```javascript class OptimizedTableRow extends PureComponent { shouldComponentUpdate(nextProps) { return !isEqual(this.props.record, nextProps.record); // Use lodash's isEqual method to compare objects deeply. } render() { const { record } = this.props; return ( <tr key={record.id}> {/* Render table cells */} </tr> ); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值