会有大量数据的ant的select框优化(分页+打开virtual虚拟滚动+loading加载效果+usedebouce防抖)

组件

 <Select
              mode="multiple"
              showArrow={true}
              showSearch
              onSearch={handleSearch}
              filterOption={false}
              notFoundContent={loading ? <Spin size="small" /> : null}
              loading={loading ? <Spin size="small" /> : null}
              onPopupScroll={handleScroll}
              autoClearSearchValue={false}
              virtual={true}
              listItemHeight={10}
              listHeight={150}
            >
              {options.map((item, index) => (
                <Option value={item.id} key={item.id + index}>
                  {item.name}
                </Option>
              ))}
            </Select>

下拉滚动分页,获取到的数组用some查重再放入原来的数组里面,添加loading 下拉或者未加载完的时候会有loading效果,加入usedebounce避免滚动过度频繁

  const handleScroll = (e) => {
    const { scrollTop, clientHeight, scrollHeight } = e.target;
    if (scrollTop + clientHeight >= scrollHeight) {
      setPage((prevPage) => prevPage + 1);
      // loadData(page + 1);
      setReselect((a) => ++a);
    }
  };
 useEffect(() => {
    loadData();
  }, [reselect]);
  const loadData = useDebounce(() => {
    setLoading(true);

    axios
      .post(
        page: {
          currentPage: page,
          pageSize: 10,
        },
      })
      .then((res) => res.data)
      .then((data) => {
        if (data.code === 0) {
          if (data.data === null) {
            setLoading(false);
          } else {
            setOptions((prevOptions) => {
              const existingOptions = prevOptions.filter(
                (option) =>
                  !data.data.records.some(
                    (newOption) => newOption.id === option.id
                  )
              );
              return [...existingOptions, ...data.data.records];
            });
            setLoading(false);
          }
        } else {
          setLoading(false);

          console.log(data.message);
        }
      })
      .catch((err) => {
        console.log(err);
      });
  }, 300);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值