index.tsx 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. import { Searchs } from '@/utils/searchs';
  2. import { NPagination } from 'naive-ui';
  3. import {
  4. PropType,
  5. computed,
  6. defineComponent,
  7. onMounted,
  8. onUnmounted,
  9. reactive,
  10. ref,
  11. watch
  12. } from 'vue';
  13. import { useRoute } from 'vue-router';
  14. import styles from './index.module.less';
  15. export default defineComponent({
  16. name: 'table-container',
  17. props: {
  18. page: {
  19. type: Number,
  20. default: 1,
  21. required: true
  22. },
  23. pageSize: {
  24. type: Number,
  25. default: 10
  26. },
  27. pageTotal: {
  28. type: Number,
  29. default: 0
  30. },
  31. saveKey: {
  32. type: String,
  33. default: ''
  34. },
  35. sync: {
  36. type: Boolean,
  37. default: false
  38. },
  39. checkedRowKeysRef: {
  40. type: Object
  41. },
  42. disabled: {
  43. type: Boolean,
  44. default: false
  45. },
  46. pageSizes: {
  47. type: Array as PropType<any>,
  48. default: () => [10, 20, 30, 40]
  49. }
  50. },
  51. emits: ['update:page', 'update:pageSize', 'list'],
  52. setup(props, { emit }) {
  53. const route = useRoute();
  54. const state = reactive({
  55. pageInformation: null as any
  56. });
  57. const pageCount = ref(0);
  58. pageCount.value = Math.ceil(props.pageTotal / props.pageSize);
  59. // 当前页发生改变时的回调函数
  60. const onUpdatePage = (page: number) => {
  61. emit('update:page', page);
  62. emit('list');
  63. syncStore();
  64. };
  65. // 当前分页大小发生改变时的回调函数
  66. const onUpdatePageSize = (pageSize: number) => {
  67. emit('update:pageSize', pageSize);
  68. emit('update:page', 1);
  69. emit('list');
  70. syncStore();
  71. };
  72. onMounted(() => {
  73. if (props.sync) {
  74. const searchs = new Searchs(props.saveKey || route.path);
  75. const active = searchs.get(props.saveKey || route.path);
  76. state.pageInformation = active;
  77. if (active && active.page) {
  78. for (const key in active.page) {
  79. if (
  80. // eslint-disable-next-line no-prototype-builtins
  81. active.page.hasOwnProperty(key) &&
  82. ['page', 'pageSize'].includes(key)
  83. ) {
  84. const item = active.page[key];
  85. const tempKey = `update:${key}` as any;
  86. emit(tempKey, item);
  87. }
  88. }
  89. }
  90. if (props.saveKey) {
  91. searchs.update(route.path, undefined, 'bind');
  92. }
  93. }
  94. window.addEventListener('watchStorage', watchStorage);
  95. });
  96. onUnmounted(() => {
  97. window.removeEventListener('watchStorage', watchStorage);
  98. });
  99. watch(
  100. () => props.pageSize,
  101. () => {
  102. pageCount.value = Math.ceil(props.pageTotal / props.pageSize);
  103. syncStore();
  104. }
  105. );
  106. watch(
  107. () => props.page,
  108. () => {
  109. syncStore();
  110. }
  111. );
  112. watch(
  113. () => props.pageTotal,
  114. () => {
  115. pageCount.value = Math.ceil(props.pageTotal / props.pageSize);
  116. syncStore();
  117. }
  118. );
  119. const currentPage = computed({
  120. get() {
  121. return props.page;
  122. },
  123. set(val) {
  124. emit('update:page', val);
  125. }
  126. });
  127. const syncStore = () => {
  128. if (props.sync) {
  129. const searchs = new Searchs(props.saveKey || route.path);
  130. searchs.update(
  131. {
  132. page: props.page,
  133. pageCount: pageCount.value,
  134. pageSize: props.pageSize,
  135. saveKey: props.saveKey
  136. },
  137. undefined,
  138. 'page'
  139. );
  140. }
  141. };
  142. const watchStorage = () => {
  143. const page =
  144. state.pageInformation && state.pageInformation.page
  145. ? state.pageInformation.page
  146. : null;
  147. currentPage.value = page && page.page ? page.page : 1;
  148. };
  149. return () => (
  150. <NPagination
  151. disabled={props.disabled}
  152. class={styles.pagination}
  153. v-model:page={props.page}
  154. displayOrder={['quick-jumper', 'pages', 'size-picker']}
  155. pageCount={pageCount.value}
  156. showQuickJumper
  157. showSizePicker
  158. pageSize={props.pageSize}
  159. prefix={() => `共 ${props.pageTotal} 条`}
  160. pageSizes={props.pageSizes}
  161. onUpdatePage={onUpdatePage}
  162. onUpdatePageSize={onUpdatePageSize}></NPagination>
  163. );
  164. }
  165. });