personal.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { defineComponent, reactive, ref } from 'vue'
  2. import { List } from 'vant'
  3. import request from '@/helpers/request'
  4. import Item from '../list/item'
  5. import { musicBuy } from '../music'
  6. import { useRoute } from 'vue-router'
  7. import ColResult from '@/components/col-result'
  8. import { state } from '@/state'
  9. import styles from './index.module.less'
  10. import Song from '../component/song'
  11. export default defineComponent({
  12. name: 'MusicList',
  13. emits: ['favorite'],
  14. setup(props, { expose, emit }) {
  15. const route = useRoute()
  16. const params = reactive({
  17. search: (route.query.search as string) || '',
  18. musicTagIds: route.query.tagids || '',
  19. page: 1
  20. })
  21. const data = ref<any>(null)
  22. const rows = ref<any[]>([])
  23. const loading = ref(false)
  24. const finished = ref(false)
  25. const isError = ref(false)
  26. const FetchList = async () => {
  27. if (loading.value) {
  28. return
  29. }
  30. loading.value = true
  31. isError.value = false
  32. try {
  33. const res = await request('/music/sheet/my', {
  34. prefix:
  35. state.platformType === 'TEACHER' ? '/api-teacher' : '/api-student',
  36. params
  37. })
  38. rows.value = [...rows.value, ...res.data.rows]
  39. data.value = res.data
  40. params.page = res.data.pageNo + 1
  41. finished.value = res.data.pageNo >= res.data.totalPage
  42. } catch (error) {
  43. isError.value = true
  44. }
  45. loading.value = false
  46. }
  47. expose({
  48. reset: () => {
  49. isError.value = false
  50. rows.value = []
  51. params.page = 1
  52. finished.value = false
  53. FetchList()
  54. },
  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. musicBuy(item)
  71. }}
  72. />
  73. </div>
  74. ) : (
  75. !loading.value && (
  76. <ColResult tips="暂无单曲" classImgSize="SMALL" btnStatus={false} />
  77. )
  78. )}
  79. </List>
  80. )
  81. }
  82. })