React+Antd实现Table数据滚动加载

          做为一个初入前端的小菜鸟来说,突然接到需求要实现某一列表数据的滚动加载功能时,当时是很蒙蔽和彷徨的,好在有丰富的网络资源供我查阅,最终完成了该功能,现在就把该功能实现的代码分享给大家,望各位前端大佬不吝赐教。

        思路是给Table设置一个监听滚动条的事件(onScrollEvent),方便时刻检查滚动条是否触底而调用后台加载数据,在滚动条触底后将新请求的数据追加到上一次的dataSource中,并重新渲染页面

    

<div onScrollCapture={onScrollEvent}>
	<Table
		columns={columns}
		scroll={{ x: 1800, y: 480 }}
		dataSource={dataSource}
		rowKey='id'
        loading={loading}
		pagination={false}
		sticky={true}
		ref={(c) => { scrollRef.current = c }}
    />
</div>


// 滚动条处理逻辑
const onScrollEvent = async () => {
  // 如果正在加载数据中,不重复进行操作
  if (loading) return;

  // 获取表格dom元素
  const table = ReactDOM.findDOMNode(scrollRef.current);
  const tableBody = (table as Element)?.querySelector('.ant-table-body');

  // 容器可视区高度
  const tableBodyHeight: number = tableBody?.clientHeight ? tableBody?.clientHeight : 0;

  // 内容高度
  const contentHeight = tableBody?.scrollHeight ? tableBody?.scrollHeight : 0;

  // 距离顶部的高度
  const toTopHeight = tableBody?.scrollTop ? tableBody?.scrollTop : 0;

  // 如果后端数据总条数小于50 或者后端数据条数等于当前页面展示的总条数并且滚动条没有出现,不需要再去调用后端去请求数据
  if ((dataSource.length === totalElements && toTopHeight === 0) || totalElements <= 50) {
    return;
  }

  // 如果是横向滚动条变化,则不触发后续接口调用
  if (tableScrollLeft !== tableBody?.scrollLeft) {
    setTableScrollLeft(tableBody?.scrollLeft ? tableBody?.scrollLeft : 0);
    return;
  }

  // 当距离底部只有1时,重新获取数据
  if (contentHeight - (toTopHeight + tableBodyHeight) <= 1) {
    // 如果当前页数据大于等于总页数,则代表没有数据了
    if (currentPageIndex >= totalPages || dataSource.length === totalElements) {
      message.success('已经是最后一页了', 2);
      return;
    }
    setTableDataLoading(() => true);

    // 加载数据
    const res = await dispatch(getList({
      pageIndex: currentPageIndex + 1,
      pageSize: 50
    }));

    // 将新的数据进行拼接
    setDataSource((preState: any) => {
      return [...preState, ...res?.list]
    });
    // 让滚动条重回顶部
    resetToTopHeight(); 
    setCurrentPageIndex((preState: any) => preState + 1);
    message.success(`加载了${res.list.length}条数据!`);
    setTableDataLoading(() => false);
  }

}

  // 滚动条重回顶部的函数
  const resetToTopHeight = () => {
    //console.log('滚动条重回顶部');
    const table = ReactDOM.findDOMNode(tableScrollRef.current);
    // 获取表格dom元素
    const tableBody: any = (table as Element)?.querySelector('.ant-table-body');
    // 距离顶部的高度
    if (tableBody?.scrollTop) {
      tableBody.scrollTop = 0;
    }
    //const toTopHeight = tableBody?.scrollTop ? tableBody?.scrollTop : 0;
  }

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
下拉多选可以使用antd-mobile的CheckboxItem组件来实现。具体代码如下: ```jsx import React, { useState } from 'react'; import { List, Checkbox } from 'antd-mobile'; const CheckboxItem = Checkbox.CheckboxItem; const options = [ { label: '选项1', value: '1' }, { label: '选项2', value: '2' }, { label: '选项3', value: '3' }, { label: '选项4', value: '4' }, ]; const MultipleSelect = () => { const [selectedValues, setSelectedValues] = useState([]); const handleCheckboxChange = (value) => { const currentIndex = selectedValues.indexOf(value); const newValues = [...selectedValues]; if (currentIndex === -1) { newValues.push(value); } else { newValues.splice(currentIndex, 1); } setSelectedValues(newValues); }; return ( <List> {options.map((option) => ( <CheckboxItem key={option.value} checked={selectedValues.indexOf(option.value) !== -1} onChange={() => handleCheckboxChange(option.value)} > {option.label} </CheckboxItem> ))} </List> ); }; export default MultipleSelect; ``` 上面的代码中,我们定义了一个`options`数组来存储选项列表。然后使用`useState`来管理已选中的值,初始值为空数组。在`handleCheckboxChange`方法中,我们根据选项的值来判断它是否已经被选中,如果已经被选中,则从已选中的值数组中删除该值,否则将该值添加到已选中的值数组中。最后通过`setSelectedValues`更新已选中的值数组。 在渲染,我们遍历选项列表,并为每个选项渲染一个`CheckboxItem`组件。我们使用`checked`属性来判断该选项是否已经被选中,使用`onChange`事件来处理选项的选择和取消选择操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值