美文网首页
Antd Table 下拉加载数据

Antd Table 下拉加载数据

作者: _lahne | 来源:发表于2019-04-26 10:51 被阅读0次

    背景

    使用react+antd开发 下拉加载更多数据


    image.png

    Antd的Table组件本身是不提供滚动事件的;在开发时,需求使用table实现下拉加载数据,根据查询到的实现逻辑能实现下拉刷新数据,其源代码如下:

    //使用div包裹Antd  Table,监听div的scroll事件
    <div
      onScrollCapture={() => onScrollEvent(this)}
      style={{ height: '350px', overflowY: 'scroll' }}
      ref={c => {
        this.scrollRef = c;
      }}
    >
      <Table
        columns={columns}
        dataSource={dataSource}
        pagination={false}
        loading={tableLoading}
        scroll={{ x: '120%'}}
      />
    </div>
    
    //js实现: 以下代码在横向滑动时也会加载数据--BUG
    onScrollEvent(el) {
        if (el.scrollRef.scrollTop + el.scrollRef.clientHeight === el.scrollRef.scrollHeight) {
            this.queryData(null, "scroll");
        }
      }
    

    若要解决以上代码在横向滑动时也会加载数据的Bug,可尝试以下方法

    解决

    原理:
    纵向滚动时,滚动的高度是时刻在变化的,当纵向滚动时,纵向产生位移,上一次与当前的滚动位置肯定不等,当滚动高度加上容器高度等于可滚动高度则刷新;当为横向滚动时,纵向未产生位移
    获取Table元素,使用JS原生scroll事件

    //这里Table不放在容器中,使用ref把table元素暴露给this.tableEl
    <Table
          columns={columns}
          dataSource={dataSource}
          pagination={false}
          loading={tableLoading}
          scroll={{y: 500}}
          //----------添加如下--------------------------
          ref={(ref)=>this.tableEl=ref}
    />
    
    //在钩子函数中处理
    componentDidMount(){
        //注: 为Table设置ID 通过document.getElementById 也可以获取table元素
        const table = ReactDom.findDOMNode(this.tableEl);
        const tableBody = table.querySelector('.ant-table-body');
        let _scrollTop = 0;//保存上次滚动距离
        let isRun = false;//是否执行查询
        tableBody.addEventListener('scroll', () => {
          if(tableBody.scrollTop === 0 ){
            _scrollTop = 0;
          }
          // 上一次滚动高度与当前滚动高度不同则是纵向滚动
          if (_scrollTop != tableBody.scrollTop) {
            //是否滑动到距离底部40px的位置
            const scorll = _scrollTop >= tableBody.scrollHeight-tableBody.clientHeight-40;
            //isRun为true时 代表已经执行查询
            if(isRun && scorll){
              return;
            }
            //_scrollTop < tableBody.scrollTop 判断是否向下滑动
            isRun = _scrollTop < tableBody.scrollTop && scorll;
            //保存当前滚动位置
            _scrollTop = tableBody.scrollTop;
            if (isRun) {
              this.props.onQueryData("scroll");
            }
          }
        })
    }
    

    注:react-infinite-scroller楼主没有尝试过,大家可以尝试看是否也能实现下拉刷新

    以上代码若有问题欢迎在评论区讨论6

    相关文章

      网友评论

          本文标题:Antd Table 下拉加载数据

          本文链接:https://www.haomeiwen.com/subject/kdffnqtx.html