chapter.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. import { defineComponent, reactive, toRefs, watch, ref } from 'vue';
  2. import styles from './chapter.module.less';
  3. import iconMenuChapter from '../image/icon-menu-chapter.svg';
  4. import { Collapse, CollapseItem, Icon, Image, showToast } from 'vant';
  5. import chapterDown from '../image/chapter-down-arrow.svg';
  6. import chapterDefault from '../image/chapter-default-arrow.svg';
  7. import chapterVideo from '../image/chapter-video.svg';
  8. import { state } from '@/state';
  9. export default defineComponent({
  10. name: 'chapter',
  11. props: {
  12. detail: {
  13. type: Object,
  14. default: () => []
  15. },
  16. itemActive: {
  17. type: String,
  18. default: ''
  19. },
  20. active: {
  21. type: String,
  22. default: ''
  23. }
  24. },
  25. emits: ['handleSelect'],
  26. setup(props, { emit }) {
  27. const { detail, itemActive, active } = toRefs(props);
  28. console.log(6666,itemActive.value,active.value,detail.value)
  29. const pointData = reactive({
  30. active: active.value,
  31. coursewareList: [],
  32. parentItem: {},
  33. });
  34. const showSelectCourseware = ref(false);
  35. watch(
  36. () => props.itemActive,
  37. () => {
  38. // console.log(itemActive.value, active.value, detail.value, 'active');
  39. pointData.active = active.value;
  40. }
  41. );
  42. return () => (
  43. <div class={styles.container}>
  44. <div class={styles.pointHead}>
  45. <img src={iconMenuChapter} />
  46. 切换章节
  47. </div>
  48. <div class={styles.content}>
  49. <Collapse
  50. class={styles.collapse}
  51. modelValue={pointData.active}
  52. onUpdate:modelValue={(val: any) => {
  53. pointData.active = val;
  54. }}
  55. border={false}
  56. accordion>
  57. {detail.value.map((item: any) => (
  58. <CollapseItem
  59. center
  60. class={[
  61. styles.collapseItem,
  62. pointData.active === item.id ? styles.activeItem : ''
  63. ]}
  64. border={false}
  65. isLink={false}
  66. title={item.name}
  67. titleClass={'van-ellipsis'}
  68. titleStyle={{ width: '80%' }}
  69. name={item.id}>
  70. {{
  71. default: () => (
  72. <>
  73. {item.knowledgeList.map((know: any) => (
  74. <div
  75. class={[
  76. styles.item,
  77. itemActive.value == know.id ? styles.itemActive : ''
  78. ]}
  79. onClick={() => {
  80. // 判断是否选择的同一个课件
  81. if (itemActive.value == know.id) {
  82. return;
  83. }
  84. if (!know.containMaterial) {
  85. showToast('该章节暂无课件');
  86. return;
  87. }
  88. emit('handleSelect', {
  89. itemActive: know.id,
  90. itemName: know.name,
  91. coursewareNum: know.coursewareNum,
  92. tabActive: item.id,
  93. tabName: item.name
  94. });
  95. const lastTimeKey =
  96. 'lastTime' + (state?.user?.data?.phone ?? '');
  97. localStorage.setItem(lastTimeKey, know.id);
  98. }}>
  99. <Image src={chapterVideo} class={styles.itemImage} />
  100. <span style={{ width: '80%' }} class="van-ellipsis">
  101. {know.name}
  102. </span>
  103. </div>
  104. ))}
  105. </>
  106. ),
  107. icon: () => (
  108. <img
  109. class={styles.arrow}
  110. src={
  111. pointData.active === item.id
  112. ? chapterDown
  113. : chapterDefault
  114. }
  115. />
  116. )
  117. }}
  118. </CollapseItem>
  119. ))}
  120. </Collapse>
  121. </div>
  122. </div>
  123. );
  124. }
  125. });