ListComponentParent.js 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /* eslint-disable no-console */
  2. /* eslint-disable react/jsx-props-no-spreading */
  3. /* eslint-disable no-underscore-dangle */
  4. import * as React from "react";
  5. import { Divider, List, Layout } from "@ui-kitten/components";
  6. import { useFocusEffect } from "@react-navigation/native";
  7. // import { useModel } from "flooks";
  8. import { useBoolean, useCreation } from "@umijs/hooks";
  9. import EmptyComponent from "./EmptyComponent";
  10. export default function ListComponent(props) {
  11. const loading = useBoolean();
  12. const refreshing = useBoolean();
  13. const {
  14. dataList,
  15. getInfo,
  16. renderItem,
  17. ListHeaderComponent,
  18. style,
  19. separatorStyle,
  20. ListFooterComponent,
  21. showEmpty,
  22. showList,
  23. extraData,
  24. initialNumToRender,
  25. } = props;
  26. function getList() {
  27. if (getInfo != null) {
  28. return getInfo();
  29. }
  30. return Promise.reject();
  31. }
  32. // 刷新接口
  33. function onRefresh() {
  34. refreshing.setTrue();
  35. getList().finally(() => {
  36. refreshing.setFalse();
  37. });
  38. }
  39. // 到页面底部加载更多
  40. function gotEnd() {
  41. loading.setTrue();
  42. getList().finally(() => {
  43. loading.setFalse();
  44. });
  45. }
  46. useFocusEffect(
  47. React.useCallback(() => {
  48. onRefresh();
  49. }, [])
  50. );
  51. const showdataList = useCreation(() => {
  52. const returnList = [];
  53. if (!refreshing.state) {
  54. dataList.forEach(value => {
  55. returnList.push(value);
  56. if (value.children.length > 0) {
  57. returnList.push(
  58. value.children.map((item, index) => {
  59. return { ...item, childIndex: index };
  60. })
  61. );
  62. }
  63. });
  64. }
  65. return [
  66. ...returnList.flat().map(item => {
  67. if (item.amount != null) {
  68. item.amount = item.amount.toString();
  69. }
  70. return item;
  71. }),
  72. ];
  73. }, [dataList, refreshing.state]);
  74. const changePorps = React.useMemo(() => {
  75. let _props = { renderItem: () => <Layout /> };
  76. if (showList !== false) {
  77. _props = { renderItem };
  78. if (extraData) {
  79. _props = {
  80. ..._props,
  81. extraData,
  82. };
  83. }
  84. }
  85. return _props;
  86. }, [showList, extraData]);
  87. const ListEmptyComponent = React.useMemo(() => {
  88. if (showEmpty && !refreshing && !loading) {
  89. return EmptyComponent;
  90. }
  91. return <></>;
  92. }, [showEmpty, refreshing, loading.state]);
  93. return (
  94. <List
  95. refreshing={refreshing.state}
  96. style={[style]}
  97. data={showdataList}
  98. removeClippedSubviews
  99. initialNumToRender={initialNumToRender || 10}
  100. ListHeaderComponent={ListHeaderComponent}
  101. ListEmptyComponent={ListEmptyComponent}
  102. onRefresh={onRefresh}
  103. onEndReached={0.2}
  104. ItemSeparatorComponent={() => <Divider style={[separatorStyle]} />}
  105. onEndReachedThreshold={gotEnd}
  106. ListFooterComponent={ListFooterComponent}
  107. {...changePorps}
  108. />
  109. );
  110. }