catalogueTree.vue 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. <template>
  2. <div class="node-wrapper">
  3. <div v-for="node in nodes" :key="node.id" :class="['node', { active: getCurChapterId() === node.id }]">
  4. <div
  5. :class="['node-name', 'nowrap-ellipsis', { content: node.is_leaf_chapter === 'true' }]"
  6. :title="node.name"
  7. @click="handleSelectNode(node.is_leaf_chapter, node.id)"
  8. >
  9. <span>{{ node.name }}</span>
  10. </div>
  11. <CatalogueTree v-if="node.nodes && node.is_leaf_chapter === 'false'" :nodes="node.nodes" />
  12. </div>
  13. </div>
  14. </template>
  15. <script>
  16. export default {
  17. name: 'CatalogueTree',
  18. inject: ['selectNode', 'getCurChapterId'],
  19. props: {
  20. nodes: {
  21. type: Array,
  22. required: true,
  23. },
  24. },
  25. data() {
  26. return {};
  27. },
  28. methods: {
  29. handleSelectNode(is_leaf_chapter, id) {
  30. if (is_leaf_chapter === 'false') return;
  31. this.selectNode(id);
  32. },
  33. },
  34. };
  35. </script>
  36. <style lang="scss" scoped>
  37. .node {
  38. &.active {
  39. background-color: #f3f3f3;
  40. }
  41. &-name {
  42. padding-bottom: 4px;
  43. &.content {
  44. cursor: pointer;
  45. &:hover {
  46. color: #409eff;
  47. }
  48. }
  49. &:not(.content) {
  50. font-weight: bold;
  51. }
  52. }
  53. .node {
  54. margin-left: 20px;
  55. }
  56. }
  57. </style>