ListComponent.js 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import React from "react";
  2. import { StyleSheet } from "react-native";
  3. import { initDataState, DataListReducer } from "../Redux/DataListRedux";
  4. import { Divider, List, Layout } from "@ui-kitten/components";
  5. import { useModel } from "flooks";
  6. import { useFocusEffect } from "@react-navigation/native";
  7. import EmptyComponent from "./EmptyComponent";
  8. export default function ListComponent(props) {
  9. const [state, dispatch] = React.useReducer(DataListReducer, initDataState);
  10. const { page, size, finish, loading, refreshing, dataList, error } = state;
  11. const {
  12. getInfo,
  13. renderItem,
  14. ListHeaderComponent,
  15. style,
  16. separatorStyle,
  17. ListFooterComponent,
  18. showEmpty,
  19. emptyEvent,
  20. showList,
  21. extraData,
  22. delId,
  23. setChild,
  24. startState,
  25. } = props;
  26. useFocusEffect(
  27. React.useCallback(() => {
  28. if (startState != false) {
  29. onRefresh();
  30. }
  31. }, [])
  32. );
  33. React.useEffect(() => {
  34. if (startState) {
  35. onRefresh();
  36. }
  37. }, [startState]);
  38. function getList() {
  39. if (getInfo != null) {
  40. return getInfo(page, size).then(res => {
  41. console.log(res);
  42. if (emptyEvent) {
  43. if (res.numberOfElements === 0) {
  44. emptyEvent(true);
  45. } else {
  46. emptyEvent(false);
  47. }
  48. }
  49. dispatch({
  50. type: "setInfo",
  51. payload: { list: res.content, finish: res.last },
  52. });
  53. });
  54. } else {
  55. return Promise.reject();
  56. }
  57. }
  58. React.useEffect(() => {
  59. if (delId) {
  60. let list = [...dataList];
  61. let Index = list.findIndex(item => {
  62. return item.id === delId;
  63. });
  64. if (Index != -1) {
  65. dispatch({
  66. type: "remove",
  67. payload: { index: Index },
  68. });
  69. }
  70. }
  71. }, [delId]);
  72. // 刷新接口
  73. function onRefresh() {
  74. dispatch({ type: "startPageMore" });
  75. getList()
  76. .then(() => {
  77. dispatch({ type: "pageMoreSuccess" });
  78. })
  79. .catch(e => {
  80. dispatch({
  81. type: "pageMoreError",
  82. payload: { error: e.message },
  83. });
  84. });
  85. }
  86. // 到页面底部加载更多
  87. function gotEnd() {
  88. dispatch({ type: "startRefresh" });
  89. getList()
  90. .then(() => {
  91. dispatch({ type: "refreshSuccess" });
  92. })
  93. .catch(e => {
  94. dispatch({
  95. type: "refreshError",
  96. payload: { error: e.message },
  97. });
  98. });
  99. }
  100. const changePorps = React.useMemo(() => {
  101. let _props = { renderItem: () => <Layout /> };
  102. if (showList != false) {
  103. _props = { renderItem: renderItem };
  104. if (showEmpty) {
  105. _props = {
  106. ..._props,
  107. ListEmptyComponent: EmptyComponent,
  108. };
  109. }
  110. if (extraData) {
  111. _props = {
  112. ..._props,
  113. extraData,
  114. };
  115. }
  116. }
  117. return _props;
  118. }, [showList, showEmpty, extraData]);
  119. return (
  120. <List
  121. refreshing={refreshing}
  122. style={[style]}
  123. data={dataList}
  124. ListHeaderComponent={ListHeaderComponent}
  125. onRefresh={onRefresh}
  126. onEndReached={0.2}
  127. ItemSeparatorComponent={() => <Divider style={[separatorStyle]} />}
  128. onEndReachedThreshold={gotEnd}
  129. ListFooterComponent={ListFooterComponent}
  130. {...changePorps}
  131. />
  132. );
  133. }