list.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import { defineComponent, onMounted, reactive } from "vue";
  2. import styles from "./index.module.less";
  3. import { api_musicSheetPage } from "../../api";
  4. import state, { togglePlay } from "/src/state";
  5. import { List } from "vant";
  6. import { postMessage } from "/src/utils/native-message";
  7. import qs from "query-string";
  8. export default defineComponent({
  9. name: "TheMusicList-list",
  10. props: {
  11. recentFlag: {
  12. type: Boolean,
  13. default: false,
  14. },
  15. },
  16. setup(props) {
  17. const forms = reactive({
  18. page: 1,
  19. rows: 20,
  20. musicSheetCategoriesId: state.bizMusicCategoryId,
  21. recentFlag: props.recentFlag ? true : null,
  22. excludeMusicId: props.recentFlag ? null : state.examSongId,
  23. });
  24. const data = reactive({
  25. list: [] as any[],
  26. finished: false,
  27. loading: false,
  28. });
  29. const getList = async () => {
  30. data.loading = true;
  31. try {
  32. const res = await api_musicSheetPage({
  33. ...forms,
  34. });
  35. if (res?.code === 200 && Array.isArray(res.data?.rows)) {
  36. data.list = [...data.list, ...res.data.rows];
  37. }
  38. data.finished = res.data?.rows?.length < forms.rows;
  39. } catch (error) {
  40. console.log(error);
  41. }
  42. data.loading = false;
  43. };
  44. onMounted(() => {
  45. getList();
  46. });
  47. const openAccomapina = (item: any) => {
  48. if (item.id === state.examSongId) return;
  49. // 暂停播放
  50. togglePlay("paused");
  51. postMessage({
  52. api: "cloudLoading",
  53. content: {
  54. show: true,
  55. type: "fullscreen",
  56. },
  57. });
  58. location.href =
  59. location.origin +
  60. location.pathname +
  61. "?" +
  62. qs.stringify({
  63. id: item.id,
  64. _t: Date.now(),
  65. });
  66. };
  67. return () => (
  68. <div class={styles.wrap}>
  69. <List
  70. loading={data.loading}
  71. finished={data.finished}
  72. immediateCheck={false}
  73. onLoad={() => {
  74. forms.page++;
  75. getList();
  76. }}
  77. >
  78. {data.list.map((item: any) => {
  79. return (
  80. <div
  81. class={[styles.item, state.examSongId == item.id && styles.itemActive]}
  82. onClick={() => openAccomapina(item)}
  83. >
  84. {item.musicSheetName}
  85. </div>
  86. );
  87. })}
  88. {!data.loading && data.list.length === 0 && <div class={styles.noData}>暂无数据</div>}
  89. </List>
  90. </div>
  91. );
  92. },
  93. });