滚动加载请求下一页数据加载时 显示图标【react】

1.定义监听对象

useInViewport:观察元素是否在可见区域,以及元素可见比例
const ref = useRef<HTMLDivElement>(null); 
const [inViewport] = useInViewport(ref);
const refScroll = useRef<HTMLDivElement>(null); 
const [requestingTree, setRequestingTree] = useState(false); //请求状态
const [treeData, setTreeData] = useState({} as { data: guideTree[]; recordsTotal: number }); //数据
const [defaultParams] = useState({
    length: 50,
    searchMap: { status: '1' },
    start: 0,
  });
  1. 接口调用
// getTree 接口地址
const { runAsync: runGuideTree, loading: treeLoading } = useRequest(getTree, {
    manual: true,
    onSuccess: (result: any, params) => {
      let newData = result?.data;
      if (params[0].start !== 0) {
        newData = treeData.data.concat(result.data);
      }
      setTreeData({ ...result, data: newData });
      setRequestingTree(false);
    },
    defaultParams: [defaultParams],
  });
  1. 根据inViewport 判断是否请求下一个数据
useUpdateEffect(() => {
    if (!requestingTree && inViewport && (treeData!.data || []).length < +treeData.recordsTotal) {
      setRequestingTree(true);
      const obj = Object.assign(defaultParams, {
        length: 50,
        searchMap: {
          status: '1' 
        },
        start: treeData.data ? treeData.data.length + 1 : 0,
      });
      runGuideTree(obj);
    }
  }, [inViewport]);
  1. 页面渲染
<Spin spinning={treeLoading}>
    <div className="tree">
      {treeData && treeData.data && treeData.data.length === 0 ? (
        <div className="tree-right-empty">
          <FrownOutlined />
          <div>暂无数据</div>
        </div>
      ) : (
        <Scrollbar ref={refScroll} style={{ zIndex: 999 }}>
          {treeData &&
            treeData.data &&
            treeData.data.map((value, index) => (
              <Itemdiv
                ref={ref}
                index={index}
                className="tree-item border-need"
                active={currentShop.id == value.id}
                key={Math.random()}
                onClick={async () => {
                  handlerCurrentSelect(value, {});
                  setCurrentShop(value);
                }}
              >
                <TableOverflowText style={{ overflow: 'auto' }} content={value.label || ''} />
              </Itemdiv>
            ))}
          {(treeData!.data || []).length < +treeData.recordsTotal && inViewport && (
            <div className="spins" style={{ zIndex: 1000 }}>
              <Spin spinning={requestingTree} />
            </div>
          )}
          {(treeData!.data || []).length + 1 === +treeData.recordsTotal && (
            <div className="footers">已经到底部啦~</div>
          )}
        </Scrollbar>
      )}
    </div>
</Spin>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值