points.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { defineComponent, reactive } from 'vue'
  2. import styles from './point.module.less'
  3. import iconMulv from '../image/icon-mulv.svg'
  4. import iconArrow from '../image/icon-arrow.svg'
  5. import { Collapse, CollapseItem } from 'vant'
  6. export default defineComponent({
  7. name: 'points',
  8. props: {
  9. data: {
  10. type: Array,
  11. default: () => []
  12. },
  13. tabActive: {
  14. type: String,
  15. default: ''
  16. },
  17. itemActive: {
  18. type: String,
  19. default: ''
  20. }
  21. },
  22. emits: ['handleSelect'],
  23. setup(props, { emit }) {
  24. const pointData = reactive({
  25. active: props.tabActive || '1610827376354500609' || ''
  26. })
  27. return () => (
  28. <div class={styles.container}>
  29. <div>
  30. <div class={styles.pointHead}>
  31. <img src={iconMulv} />
  32. 课程目录
  33. </div>
  34. <Collapse
  35. class={styles.collapse}
  36. modelValue={pointData.active}
  37. onUpdate:modelValue={(val: any) => {
  38. pointData.active = val
  39. }}
  40. accordion
  41. >
  42. {props.data.map((item: any) => {
  43. return (
  44. <CollapseItem center border={false} isLink={false} title={item.name} name={item.id}>
  45. {{
  46. default: () => (
  47. <>
  48. {Array.isArray(item?.materialList) &&
  49. item.materialList.map((n: any) => {
  50. return (
  51. <div
  52. class={[
  53. styles.item,
  54. props.itemActive == n.id ? styles.itemActive : ''
  55. ]}
  56. onClick={() => {
  57. emit('handleSelect', { itemActive: n.id, tabActive: item.id, tabName: item.name })
  58. }}
  59. >
  60. {n.name}
  61. </div>
  62. )
  63. })}
  64. </>
  65. ),
  66. icon: () => <img class={styles.arrow} src={iconArrow} />
  67. }}
  68. </CollapseItem>
  69. )
  70. })}
  71. </Collapse>
  72. </div>
  73. </div>
  74. )
  75. }
  76. })