points.tsx 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. import { PropType, defineComponent, reactive, watch, onMounted } from 'vue';
  2. import styles from './point.module.less';
  3. import iconMulv from '../image/icon-mulv.svg';
  4. import iconZhibo from '../image/icon-load.gif';
  5. import iconImage from '../image/icon-image.svg';
  6. import iconImageActive from '../image/icon-image-active.svg';
  7. import iconVideo from '../image/icon-video.svg';
  8. import iconVideoActive from '../image/icon-video-active.svg';
  9. import iconSong from '../image/icon-song.svg';
  10. import iconSongActive from '../image/icon-song-active.svg';
  11. import chapterDown from '../image/chapter-down-arrow.svg';
  12. import chapterDefault from '../image/chapter-default-arrow.svg';
  13. import chapterDefault2 from '../image/chapter-default-arrow2.svg';
  14. import { Icon, Collapse, CollapseItem } from 'vant';
  15. import { useRoute } from 'vue-router';
  16. export default defineComponent({
  17. name: 'points',
  18. props: {
  19. allList: {
  20. type: Array as any,
  21. default: () => []
  22. },
  23. kjId: {
  24. type: String,
  25. default: ''
  26. },
  27. zsdId: {
  28. type: String,
  29. default: ''
  30. },
  31. popShow: {
  32. type: Boolean,
  33. default: false
  34. },
  35. data: {
  36. type: Array as PropType<any[]>,
  37. default: () => []
  38. },
  39. itemActive: {
  40. type: String,
  41. default: ''
  42. },
  43. itemName: {
  44. type: String,
  45. default: ''
  46. }
  47. },
  48. emits: ['handleSelect'],
  49. setup(props, { emit }) {
  50. const route = useRoute();
  51. // 类型(VIDEO,IMG,SONG,PPT,MUSIC,LISTEN:听音,RHYTHM:节奏,THEORY:乐理知识,MUSIC_WIKI:名曲鉴赏 INSTRUMENT:乐器 MUSICIAN:音乐家),可用值:VIDEO,MUSIC,IMG,SONG,PPT,LISTEN,RHYTHM,THEORY,MUSIC_WIKI,INSTRUMENT,MUSICIAN
  52. const types: { [_: string]: string } = {
  53. SONG: '音频',
  54. VIDEO: '视频',
  55. IMG: '图片',
  56. MUSIC: '乐谱',
  57. PPT: 'PPT',
  58. LISTEN: '听音',
  59. RHYTHM: '节奏',
  60. THEORY: '乐理',
  61. MUSIC_WIKI: '名曲',
  62. INSTRUMENT: '乐器',
  63. MUSICIAN: '音乐家',
  64. };
  65. // 获取对应图片
  66. const getImage = (item: any) => {
  67. if (item.type === 'VIDEO') {
  68. return props.itemActive == item.id ? iconVideoActive : iconVideo;
  69. } else if (['IMAGE', 'IMG'].includes(item.type)) {
  70. return props.itemActive == item.id ? iconImageActive : iconImage;
  71. } else if (item.type === 'SONG') {
  72. return props.itemActive == item.id ? iconSongActive : iconSong;
  73. } else {
  74. return props.itemActive == item.id ? iconVideoActive : iconVideo;
  75. }
  76. };
  77. const pointData = reactive({
  78. allList: props.allList,
  79. kjId: props.kjId, // 当前选中的课件id
  80. zsdId: props.zsdId, // 当前选中的知识点id
  81. });
  82. watch(
  83. () => props.allList,
  84. () => {
  85. pointData.kjId = props.kjId
  86. pointData.zsdId = props.zsdId
  87. }
  88. );
  89. watch(
  90. () => props.popShow,
  91. () => {
  92. console.log('刷新123')
  93. pointData.kjId = props.kjId
  94. pointData.zsdId = props.zsdId
  95. }
  96. );
  97. return () => (
  98. <div class={styles.container}>
  99. <div class={styles.pointHead}>
  100. <img src={iconMulv} />
  101. {props.itemName}
  102. </div>
  103. <div class={styles.content}>
  104. {props.allList.length &&
  105. <Collapse
  106. class={styles.collapse}
  107. modelValue={pointData.kjId}
  108. onUpdate:modelValue={(val: any) => {
  109. pointData.kjId = val;
  110. }}
  111. border={false}
  112. accordion>
  113. {props.allList.map((item: any) => (
  114. <CollapseItem
  115. class={[
  116. styles.collapseItem,
  117. pointData.kjId === item.id ? styles.activeItem : ''
  118. ]}
  119. border={false}
  120. isLink={false}
  121. title={item.name}
  122. titleStyle={{ width: '80%' }}
  123. name={item.id}>
  124. {{
  125. default: () => (
  126. <>
  127. <Collapse
  128. class={styles.collapse}
  129. modelValue={pointData.zsdId}
  130. onUpdate:modelValue={(val: any) => {
  131. pointData.zsdId = val;
  132. }}
  133. border={false}
  134. accordion>
  135. {item.knowledgeList.map((know: any) => (
  136. <CollapseItem
  137. center
  138. class={[
  139. styles.collapseItem,
  140. styles.collapseKnow,
  141. pointData.zsdId === know.id ? styles.activeItem2 : ''
  142. ]}
  143. border={false}
  144. isLink={false}
  145. title={know.name}
  146. titleClass={'van-ellipsis'}
  147. titleStyle={{ width: '80%' }}
  148. name={know.id}>
  149. {{
  150. default: () => (
  151. <>
  152. {know.materialInfo.map((material: any, index: number) => {
  153. return (
  154. <div
  155. class={[
  156. styles.matItem,
  157. props.itemActive == material.id ? styles.itemActive : ''
  158. ]}
  159. onClick={() => {
  160. console.log(pointData.allList)
  161. emit('handleSelect', {
  162. itemActive: material.id,
  163. zsdId: know.id,
  164. kjId: item.id
  165. });
  166. }}>
  167. <div class={styles.cover}>
  168. <img src={material.url} />
  169. </div>
  170. <div class={styles.title}>
  171. <div class={styles.tag}>{types[material.type]}</div>
  172. <div>{material.name}</div>
  173. </div>
  174. </div>
  175. );
  176. })}
  177. </>
  178. ),
  179. icon: () => (
  180. <img
  181. class={styles.arrow}
  182. src={
  183. pointData.zsdId === know.id
  184. ? chapterDown
  185. : chapterDefault2
  186. }
  187. />
  188. )
  189. }}
  190. </CollapseItem>
  191. ))}
  192. </Collapse>
  193. </>
  194. ),
  195. icon: () => (
  196. <img
  197. class={[styles.arrow, styles.firstArrow]}
  198. src={
  199. pointData.kjId === item.id
  200. ? chapterDown
  201. : chapterDefault
  202. }
  203. />
  204. )
  205. }}
  206. </CollapseItem>
  207. ))}
  208. </Collapse>
  209. }
  210. {/* {props.data.map((item, index: number) => {
  211. return (
  212. <div
  213. class={[
  214. styles.item,
  215. props.itemActive == item.id ? styles.itemActive : ''
  216. ]}
  217. onClick={() => {
  218. emit('handleSelect', {
  219. itemActive: item.id
  220. });
  221. }}>
  222. <div class={styles.cover}>
  223. <img src={item.url} />
  224. </div>
  225. <div class={styles.title}>
  226. <div class={styles.tag}>{types[item.type]}</div>
  227. <div>{item.name}</div>
  228. </div>
  229. </div>
  230. );
  231. })} */}
  232. </div>
  233. </div>
  234. );
  235. }
  236. });