index.tsx 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. import {
  2. Transition,
  3. TransitionGroup,
  4. defineComponent,
  5. reactive,
  6. ref
  7. } from 'vue';
  8. import styles from './index.module.less';
  9. import { NIcon, NTree, NSpin, NScrollbar } from 'naive-ui';
  10. export default defineComponent({
  11. name: 'directory-main',
  12. setup() {
  13. const show = ref(true);
  14. const forms = reactive({
  15. expandedKey: null, // 展开
  16. selectKey: null // 选的
  17. });
  18. const treeList = ref([
  19. {
  20. key: 1,
  21. label:
  22. '第一单元 我愿住在童话里我愿住在童话里我愿住在童话里我愿住在童话里我愿住在童话里我愿住在童话里我愿住在童话里我愿住在童话里我愿住在童话里',
  23. selected: false,
  24. children: [
  25. {
  26. key: 10,
  27. label: '【欣赏】永远住在童话里'
  28. },
  29. {
  30. key: 11,
  31. label: '【欣赏】糖果仙子舞曲'
  32. },
  33. {
  34. key: 12,
  35. label: '【知识】音的高低'
  36. },
  37. {
  38. key: 13,
  39. label: '【唱歌】小红帽'
  40. }
  41. ]
  42. },
  43. {
  44. key: 2,
  45. label: '第二单元 快乐游戏',
  46. selected: false,
  47. children: [
  48. {
  49. key: 14,
  50. label: '【欣赏】永远住在童话里'
  51. }
  52. ]
  53. },
  54. {
  55. key: 3,
  56. label: '第三单元 劳动最光荣',
  57. selected: false,
  58. children: [
  59. {
  60. key: 15,
  61. label: '【欣赏】永远住在童话里'
  62. }
  63. ]
  64. },
  65. {
  66. key: 4,
  67. label: '第四单元 音乐中的动物',
  68. selected: false,
  69. children: [
  70. {
  71. key: 16,
  72. label: '【欣赏】永远住在童话里'
  73. }
  74. ]
  75. },
  76. {
  77. key: 5,
  78. label: '第五单元 动画城',
  79. selected: false,
  80. children: [
  81. {
  82. key: 17,
  83. label: '【欣赏】永远住在童话里'
  84. }
  85. ]
  86. },
  87. {
  88. key: 6,
  89. label: '第六单元 下雪啦',
  90. selected: false,
  91. children: [
  92. {
  93. key: 18,
  94. label: '【欣赏】永远住在童话里'
  95. }
  96. ]
  97. },
  98. {
  99. key: 7,
  100. label: '我的音乐网页',
  101. selected: false,
  102. children: [
  103. {
  104. key: 19,
  105. label: '【欣赏】永远住在童话里'
  106. }
  107. ]
  108. }
  109. ]);
  110. setTimeout(() => {
  111. show.value = false;
  112. }, 500);
  113. return () => (
  114. <div class={styles.directoryList}>
  115. <div class={styles['select-directory']}>
  116. <span class={['cr-ellipsis']} title="人教版二年级上册(2013)">
  117. 人教版二年级上册(2013)
  118. </span>
  119. <NIcon class={styles.iconArrow}>
  120. <svg
  121. width="11px"
  122. height="15px"
  123. viewBox="0 0 11 15"
  124. version="1.1"
  125. xmlns="http://www.w3.org/2000/svg">
  126. <g
  127. stroke="none"
  128. stroke-width="1"
  129. fill="none"
  130. fill-rule="evenodd"
  131. opacity="0.699999988">
  132. <g
  133. transform="translate(-445.000000, -137.000000)"
  134. fill="#131415">
  135. <g transform="translate(152.000000, 120.000000)">
  136. <path
  137. d="M299.326227,20.2118001 L304.934089,28.4366632 C305.245211,28.8929759 305.127511,29.515105 304.671198,29.8262273 C304.505147,29.9394437 304.308836,30 304.107861,30 L292.892139,30 C292.339854,30 291.892139,29.5522847 291.892139,29 C291.892139,28.7990254 291.952695,28.6027139 292.065911,28.4366632 L297.673773,20.2118001 C297.984895,19.7554873 298.607024,19.6377872 299.063337,19.9489096 C299.16663,20.0193364 299.255801,20.1085074 299.326227,20.2118001 Z"
  138. id="三角形"
  139. transform="translate(298.500000, 24.500000) rotate(-270.000000) translate(-298.500000, -24.500000) "></path>
  140. </g>
  141. </g>
  142. </g>
  143. </svg>
  144. </NIcon>
  145. </div>
  146. <NScrollbar class={styles.scrollBar}>
  147. <NSpin show={show.value}>
  148. {treeList.value.map((item: any, index: number) => (
  149. <div class={styles.treeParent} key={'parent' + index}>
  150. <div
  151. class={[styles.treeItem, styles.parentItem]}
  152. onClick={() => {
  153. treeList.value.forEach((child: any) => {
  154. if (item.key !== child.key) {
  155. child.selected = false;
  156. }
  157. });
  158. item.selected = item.selected ? false : true;
  159. }}>
  160. {item.children && item.children.length > 0 && (
  161. <span
  162. class={[
  163. styles.arrow,
  164. item.selected ? styles.arrowSelect : ''
  165. ]}></span>
  166. )}
  167. <p
  168. class={[
  169. styles.title,
  170. item.selected ? styles.titleSelect : ''
  171. ]}>
  172. {item.label}
  173. </p>
  174. </div>
  175. {item.selected &&
  176. item.children &&
  177. item.children.map((child: any, j: number) => (
  178. <div
  179. key={'child' + j}
  180. class={[
  181. styles.treeItem,
  182. styles.childItem,
  183. styles.animation,
  184. forms.selectKey === child.key ? styles.childSelect : ''
  185. ]}
  186. onClick={() => {
  187. forms.selectKey = child.key;
  188. }}>
  189. <span class={styles.childArrow}></span>
  190. <p class={styles.title}>{child.label}</p>
  191. </div>
  192. ))}
  193. </div>
  194. ))}
  195. </NSpin>
  196. </NScrollbar>
  197. </div>
  198. );
  199. }
  200. });