points.tsx 8.0 KB

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