detail.tsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import OEmpty from '@/components/o-empty'
  2. import OHeader from '@/components/o-header'
  3. import request from '@/helpers/request'
  4. import { state } from '@/state'
  5. import { Grid, GridItem, Image, List, Loading, showImagePreview } from 'vant'
  6. import { defineComponent, onMounted, reactive, TransitionGroup } from 'vue'
  7. import { useRoute } from 'vue-router'
  8. import styles from './index.module.less'
  9. import iconImage from '../images/icon-photo-default.png'
  10. import OSticky from '@/components/o-sticky'
  11. import OFullRefresh from '@/components/o-full-refresh'
  12. import OImage from '@/components/o-image'
  13. export default defineComponent({
  14. name: 'photo-detail',
  15. props: {
  16. orchestraId: {
  17. type: String,
  18. default: ''
  19. }
  20. },
  21. setup(props) {
  22. const route = useRoute()
  23. console.log('🚀 ~ route', route)
  24. const data = reactive({
  25. refreshing: false,
  26. loading: false,
  27. finished: false,
  28. pages: {
  29. page: 1,
  30. rows: 20
  31. },
  32. list: [] as any[]
  33. })
  34. const getList = async () => {
  35. if (data.loading) return
  36. data.loading = true
  37. if (data.refreshing) {
  38. data.list = []
  39. data.pages.page = 1
  40. }
  41. try {
  42. const res = await request.post(`${state.platformApi}/orchestraPhoto/page`, {
  43. data: {
  44. ...data.pages,
  45. orchestraPhotoAlbumId: route.query.photoId
  46. },
  47. hideLoading: data.refreshing
  48. })
  49. if (Array.isArray(res?.data?.rows)) {
  50. data.list = data.list.concat(res.data.rows)
  51. data.pages.page = res.data.current + 1
  52. data.finished = !res.data.next
  53. } else {
  54. data.finished = true
  55. }
  56. } catch {
  57. data.finished = true
  58. }
  59. data.refreshing = false
  60. data.loading = false
  61. }
  62. // 预览图片
  63. const onShowImage = (index: number) => {
  64. const files = data.list.map((file: any) => {
  65. return file.fileUrl
  66. })
  67. showImagePreview({
  68. images: files,
  69. startPosition: index,
  70. closeable: true
  71. })
  72. }
  73. onMounted(() => {
  74. getList()
  75. document.title = (route.query.name as any) || ''
  76. })
  77. return () => (
  78. <div>
  79. <OSticky
  80. onGetHeight={(height: number) => {
  81. document.documentElement.style.setProperty('--header-height', height + 'px')
  82. }}
  83. >
  84. <OHeader />
  85. </OSticky>
  86. <OFullRefresh
  87. modelValue={data.refreshing}
  88. onRefresh={() => {
  89. data.refreshing = true
  90. getList()
  91. }}
  92. >
  93. <List
  94. loading={data.loading}
  95. loadingText=" "
  96. finished={data.finished}
  97. finishedText=" "
  98. onLoad={getList}
  99. immediateCheck={false}
  100. >
  101. <div class={styles.phoneListDetail}>
  102. <TransitionGroup name="van-fade">
  103. {data.list.map((item: any, index: number) => (
  104. <div
  105. key={`index-${index}`}
  106. class={styles.gridItem}
  107. onClick={() => onShowImage(index)}
  108. >
  109. <OImage class={styles.gridImg} src={item.fileUrl} />
  110. </div>
  111. ))}
  112. {!data.loading && !data.list.length && (
  113. <OEmpty key="OEmpty1" btnStatus={false} tips="暂无照片" />
  114. )}
  115. </TransitionGroup>
  116. </div>
  117. </List>
  118. </OFullRefresh>
  119. </div>
  120. )
  121. }
  122. })