数据采集小程序

List.jsx 2.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import React from 'react';
  2. import Taro from '@tarojs/taro';
  3. import { View } from '@tarojs/components';
  4. import VirtualList from '@tarojs/components/virtual-list';
  5. import { Cell, Loading } from '@antmjs/vantui';
  6. import useRequest from '@/utils/useRequest';
  7. import { getBoundList } from '@/services/bind';
  8. import Item from './Item';
  9. const Row = (props) => {
  10. const { data, index } = props;
  11. const item = data[index];
  12. const onClick = () => Taro.navigateTo({ url: `/pages/index/index?id=${item.serialNo}` });
  13. return (
  14. <Item data={item} onClick={onClick} />
  15. );
  16. }
  17. export default (props) => {
  18. const [pageInfo, setPageInfo] = React.useState({ current: 0, size: 10, total: 0, page: 0 });
  19. const [list, setList] = React.useState([]);
  20. const [loading, request] = useRequest(getBoundList);
  21. const height = 500;
  22. const itemSize = 100;
  23. const dataLen = list.length;
  24. // 所有数据读取完毕
  25. const isFinished = pageInfo.current > 0 && pageInfo.current * pageInfo.size >= pageInfo.total;
  26. const queryData = (params) => {
  27. request(params).then(res => {
  28. const { records, ...page } = res;
  29. if (page.current === 1) {
  30. setList(records || []);
  31. } else {
  32. setList(list.concat(records || []));
  33. }
  34. setPageInfo(page);
  35. }, []);
  36. };
  37. const onScroll = ({scrollDirection, scrollOffset}) => {
  38. if (
  39. // 数据还有
  40. !isFinished &&
  41. // 避免重复加载数据
  42. !loading &&
  43. // 只有往前滚动我们才触发
  44. scrollDirection === 'forward' &&
  45. // 5 = (列表高度 / 单项列表高度)
  46. // 100 = 滚动提前加载量,可根据样式情况调整
  47. scrollOffset > ((dataLen - Math.floor(height / itemSize) ) * itemSize - 50)
  48. ) {
  49. queryData({ pageNum: pageInfo.current + 1 , pageSize: 6 })
  50. }
  51. }
  52. return (
  53. <View>
  54. <VirtualList
  55. height={height}
  56. itemData={list}
  57. itemCount={dataLen}
  58. itemSize={itemSize}
  59. width="100%"
  60. onScroll={onScroll}
  61. >
  62. {Row}
  63. </VirtualList>
  64. {
  65. loading && <Loading />
  66. }
  67. {
  68. isFinished && <View className="finish-tip">我是有底线的 ~</View>
  69. }
  70. </View>
  71. )
  72. }