points.tsx 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import { defineComponent, reactive, watch } from 'vue'
  2. import styles from './point.module.less'
  3. import { iconMulv, iconArrow } from '../image/icons.json'
  4. import iconZhibo from '../image/icon-load.gif'
  5. import {
  6. iconImage,
  7. iconImageActive,
  8. iconVideo,
  9. iconVideoActive,
  10. iconSong,
  11. iconSongActive
  12. } from '../image/icons.json'
  13. import { Collapse, CollapseItem, Icon, Image } from 'vant'
  14. import PlayLoading from './play-loading'
  15. export default defineComponent({
  16. name: 'points-list',
  17. props: {
  18. data: {
  19. type: Array,
  20. default: () => []
  21. },
  22. tabActive: {
  23. type: [String, Number, Array],
  24. default: ''
  25. },
  26. itemActive: {
  27. type: String,
  28. default: ''
  29. }
  30. },
  31. emits: ['handleSelect'],
  32. setup(props, { emit }) {
  33. const pointData = reactive({
  34. active: props.tabActive[0] || '',
  35. childActive: props.tabActive[1] || ''
  36. })
  37. watch(
  38. () => props.tabActive,
  39. () => {
  40. pointData.active = props.tabActive[0] || ''
  41. pointData.childActive = props.tabActive[1] || ''
  42. }
  43. )
  44. console.log(pointData.active, 'pointData.active', props.data, props.tabActive)
  45. // 获取对应图片
  46. const getImage = (item: any) => {
  47. if (item.type === 'VIDEO') {
  48. return props.itemActive == item.id ? iconVideoActive : iconVideo
  49. } else if (['IMAGE', 'IMG'].includes(item.type)) {
  50. return props.itemActive == item.id ? iconImageActive : iconImage
  51. } else if (item.type === 'SONG') {
  52. return props.itemActive == item.id ? iconSongActive : iconSong
  53. } else {
  54. return props.itemActive == item.id ? iconVideoActive : iconVideo
  55. }
  56. }
  57. return () => (
  58. <div class={styles.container}>
  59. <div class={styles.pointHead}>
  60. <img src={iconMulv} />
  61. <span>知识点目录</span>
  62. </div>
  63. <div class={styles.content}>
  64. <Collapse
  65. class={styles.collapse}
  66. modelValue={pointData.active}
  67. onUpdate:modelValue={(val: any) => {
  68. pointData.active = val
  69. }}
  70. accordion
  71. >
  72. {props.data.map((item: any, index: number) => {
  73. return (
  74. <CollapseItem
  75. center
  76. border={false}
  77. class={index > 0 ? styles.borderTop : ''}
  78. isLink={false}
  79. title={item.name}
  80. name={item.id}
  81. >
  82. {{
  83. default: () => (
  84. <>
  85. {Array.isArray(item?.materialList) &&
  86. item.materialList.map((n: any) => {
  87. return (
  88. <div
  89. class={[
  90. styles.item,
  91. props.itemActive == n.id ? styles.itemActive : ''
  92. ]}
  93. onClick={() => {
  94. emit('handleSelect', {
  95. itemActive: n.id,
  96. tabActive: item.id,
  97. tabName: item.name
  98. })
  99. }}
  100. >
  101. <Image src={getImage(n)} class={styles.itemImage} />
  102. <span style={{ width: '80%' }} class="van-ellipsis">
  103. {n.name}
  104. </span>
  105. {/* <Icon name={iconZhibo} /> */}
  106. <div class={styles.playLoading}>
  107. <PlayLoading />
  108. </div>
  109. </div>
  110. )
  111. })}
  112. {Array.isArray(item?.children) && (
  113. <Collapse
  114. class={[
  115. styles.collapse,
  116. pointData.active === item.id ? styles.childActive : ''
  117. ]}
  118. modelValue={pointData.childActive}
  119. onUpdate:modelValue={(val: any) => {
  120. pointData.childActive = val
  121. }}
  122. accordion
  123. >
  124. {item?.children.map((child: any) => {
  125. return (
  126. <CollapseItem
  127. center
  128. border={false}
  129. isLink={false}
  130. title={child.name}
  131. name={child.id}
  132. class={styles.childCollapseItem}
  133. >
  134. {{
  135. default: () => (
  136. <>
  137. {Array.isArray(child?.materialList) &&
  138. child.materialList.map((n: any) => {
  139. return (
  140. <div
  141. class={[
  142. styles.item,
  143. props.itemActive == n.id ? styles.itemActive : ''
  144. ]}
  145. onClick={() => {
  146. emit('handleSelect', {
  147. itemActive: n.id,
  148. tabActive: child.id,
  149. tabName: child.name
  150. })
  151. }}
  152. >
  153. <Image src={getImage(n)} class={styles.itemImage} />
  154. <span style={{ width: '73%' }} class="van-ellipsis">
  155. {n.name}
  156. </span>
  157. {/* <Icon name={iconZhibo} /> */}
  158. <div class={styles.playLoading}>
  159. <PlayLoading />
  160. </div>
  161. </div>
  162. )
  163. })}
  164. </>
  165. ),
  166. icon: () => <img class={styles.arrow} src={iconArrow} />
  167. }}
  168. </CollapseItem>
  169. )
  170. })}
  171. </Collapse>
  172. )}
  173. </>
  174. ),
  175. icon: () => <img class={styles.arrow} src={iconArrow} />
  176. }}
  177. </CollapseItem>
  178. )
  179. })}
  180. </Collapse>
  181. </div>
  182. </div>
  183. )
  184. }
  185. })