points.tsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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. // 获取对应图片
  45. const getImage = (item: any) => {
  46. if (item.type === 'VIDEO') {
  47. return props.itemActive == item.id ? iconVideoActive : iconVideo
  48. } else if (['IMAGE', 'IMG'].includes(item.type)) {
  49. return props.itemActive == item.id ? iconImageActive : iconImage
  50. } else if (item.type === 'SONG') {
  51. return props.itemActive == item.id ? iconSongActive : iconSong
  52. } else {
  53. return props.itemActive == item.id ? iconVideoActive : iconVideo
  54. }
  55. }
  56. return () => (
  57. <div class={styles.container}>
  58. <div class={styles.pointHead}>
  59. <img src={iconMulv} />
  60. <span>知识点目录</span>
  61. </div>
  62. <div class={styles.content}>
  63. <Collapse
  64. class={styles.collapse}
  65. modelValue={pointData.active}
  66. onUpdate:modelValue={(val: any) => {
  67. pointData.active = val
  68. }}
  69. accordion
  70. >
  71. {props.data.map((item: any, index: number) => {
  72. return (
  73. <CollapseItem
  74. center
  75. border={false}
  76. class={index > 0 ? styles.borderTop : ''}
  77. isLink={false}
  78. title={item.name}
  79. name={item.id}
  80. >
  81. {{
  82. default: () => (
  83. <>
  84. {Array.isArray(item?.materialList) &&
  85. item.materialList.map((n: any) => {
  86. return (
  87. <div
  88. class={[
  89. styles.item,
  90. props.itemActive == n.id ? styles.itemActive : ''
  91. ]}
  92. onClick={() => {
  93. emit('handleSelect', {
  94. itemActive: n.id,
  95. tabActive: item.id,
  96. tabName: item.name
  97. })
  98. }}
  99. >
  100. <Image src={getImage(n)} class={styles.itemImage} />
  101. <span style={{ width: '80%' }} class="van-ellipsis">
  102. {n.name}
  103. </span>
  104. {/* <Icon name={iconZhibo} /> */}
  105. <div class={styles.playLoading}>
  106. <PlayLoading />
  107. </div>
  108. </div>
  109. )
  110. })}
  111. {Array.isArray(item?.children) && (
  112. <Collapse
  113. class={[
  114. styles.collapse,
  115. pointData.active === item.id ? styles.childActive : ''
  116. ]}
  117. modelValue={pointData.childActive}
  118. onUpdate:modelValue={(val: any) => {
  119. pointData.childActive = val
  120. }}
  121. accordion
  122. >
  123. {item?.children.map((child: any) => {
  124. return (
  125. <CollapseItem
  126. center
  127. border={false}
  128. isLink={false}
  129. title={child.name}
  130. name={child.id}
  131. class={styles.childCollapseItem}
  132. >
  133. {{
  134. default: () => (
  135. <>
  136. {Array.isArray(child?.materialList) &&
  137. child.materialList.map((n: any) => {
  138. return (
  139. <div
  140. class={[
  141. styles.item,
  142. props.itemActive == n.id ? styles.itemActive : ''
  143. ]}
  144. onClick={() => {
  145. emit('handleSelect', {
  146. itemActive: n.id,
  147. tabActive: child.id,
  148. tabName: child.name
  149. })
  150. }}
  151. >
  152. <Image src={getImage(n)} class={styles.itemImage} />
  153. <span style={{ width: '73%' }} class="van-ellipsis">
  154. {n.name}
  155. </span>
  156. {/* <Icon name={iconZhibo} /> */}
  157. <div class={styles.playLoading}>
  158. <PlayLoading />
  159. </div>
  160. </div>
  161. )
  162. })}
  163. </>
  164. ),
  165. icon: () => <img class={styles.arrow} src={iconArrow} />
  166. }}
  167. </CollapseItem>
  168. )
  169. })}
  170. </Collapse>
  171. )}
  172. </>
  173. ),
  174. icon: () => <img class={styles.arrow} src={iconArrow} />
  175. }}
  176. </CollapseItem>
  177. )
  178. })}
  179. </Collapse>
  180. </div>
  181. </div>
  182. )
  183. }
  184. })