points.tsx 8.3 KB

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