collection.tsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import { defineComponent, reactive, ref } from 'vue'
  2. import { List } from 'vant'
  3. import request from '@/helpers/request'
  4. import { useRoute, useRouter } from 'vue-router'
  5. import ColResult from '@/components/col-result'
  6. import { openDefaultWebView, state } from '@/state'
  7. import styles from './index.module.less'
  8. import Song from '../component/song'
  9. export default defineComponent({
  10. name: 'MusicList',
  11. emits: ['favorite'],
  12. setup(props, { expose, emit }) {
  13. const route = useRoute()
  14. const router = useRouter()
  15. const params = reactive({
  16. search: (route.query.search as string) || '',
  17. musicTagIds: route.query.tagids || '',
  18. page: 1
  19. })
  20. const rows = ref<any[]>([])
  21. const data = ref<any>(null)
  22. const loading = ref(false)
  23. const finished = ref(false)
  24. const isError = ref(false)
  25. const FetchList = async () => {
  26. if (loading.value) {
  27. return
  28. }
  29. loading.value = true
  30. isError.value = false
  31. try {
  32. const res = await request('/music/sheet/favorite', {
  33. prefix:
  34. state.platformType === 'TEACHER' ? '/api-teacher' : '/api-student',
  35. params
  36. })
  37. rows.value = [...rows.value, ...res.data.rows]
  38. data.value = res.data
  39. params.page = res.data.pageNo + 1
  40. finished.value = res.data.pageNo >= res.data.totalPage
  41. } catch (error) {
  42. isError.value = true
  43. }
  44. loading.value = false
  45. }
  46. const reset = () => {
  47. isError.value = false
  48. rows.value = []
  49. params.page = 1
  50. finished.value = false
  51. FetchList()
  52. }
  53. expose({
  54. reset,
  55. FetchList
  56. })
  57. return () => (
  58. <List
  59. loading={loading.value}
  60. finished={finished.value}
  61. finished-text={rows.value.length ? '没有更多了' : ''}
  62. onLoad={FetchList}
  63. error={isError.value}
  64. >
  65. {rows.value.length ? (
  66. <div class={styles.personalSong}>
  67. <Song
  68. list={rows.value}
  69. onDetail={(item: any) => {
  70. let url =
  71. location.origin +
  72. location.pathname +
  73. '#/music-detail?id=' +
  74. item.id
  75. if (item.favoriteProviderType) {
  76. url += `&providerType=${item.favoriteProviderType}`
  77. }
  78. openDefaultWebView(url, () => {
  79. router.push({
  80. path: '/music-detail',
  81. query: {
  82. id: item.id,
  83. providerType: item.favoriteProviderType
  84. }
  85. })
  86. })
  87. }}
  88. />
  89. </div>
  90. ) : (
  91. !loading.value && (
  92. <ColResult
  93. tips="暂无收藏单曲"
  94. classImgSize="SMALL"
  95. btnStatus={false}
  96. />
  97. )
  98. )}
  99. </List>
  100. )
  101. }
  102. })